From ac7a613d195fd62ac8bdc3df183ff8280ff2d187 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 4 Dec 2025 17:15:51 -0800 Subject: [PATCH 01/90] Squashed 'core/' changes from b691a29f..8d428bb7 8d428bb7 update doc-detective-resolver [skip ci] b8629cf1 Set release version [skip ci] 65c772a2 Auto dev release: v3.6.0-dev.2 [skip ci] a6e0924d Fix wait function to use driver.pause for synchronization (#401) 9e121a79 Auto dev release: v3.6.0-dev.1 [skip ci] 580f4d0e Standardize maxVariation logic and rename difference calculation (#400) git-subtree-dir: core git-subtree-split: 8d428bb7a62a75746668e8c2fbb21497c571b7b5 --- AGENTS.md | 25 +- package-lock.json | 546 +++------------------- package.json | 8 +- src/tests.js | 2 +- src/tests/httpRequest.js | 46 +- src/tests/runShell.js | 23 +- src/tests/saveScreenshot.js | 33 +- src/tests/wait.js | 15 +- src/utils.js | 17 +- test/artifacts/wait-with-driver.spec.json | 59 +++ 10 files changed, 241 insertions(+), 533 deletions(-) create mode 100644 test/artifacts/wait-with-driver.spec.json diff --git a/AGENTS.md b/AGENTS.md index 04a43a9..288d052 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,17 +1,20 @@ # Doc Detective Core - AI Coding Assistant Guide ## Project Overview + Doc Detective Core is a low-code documentation testing framework that validates docs through browser automation, shell commands, HTTP requests, and content analysis. It's the engine behind the Doc Detective CLI tool. ## Architecture ### Test Execution Flow + 1. **Input Resolution** (`doc-detective-resolver`): Detects tests from docs/specs → resolves to executable format 2. **Test Orchestration** (`src/tests.js`): `runSpecs()` → spec → test → context → step hierarchy 3. **Browser Automation** (`src/tests.js`): Appium server manages WebDriver sessions (Chrome/Firefox/Safari) 4. **Step Execution**: Each step type has dedicated handler in `src/tests/` (e.g., `httpRequest.js`, `runShell.js`) ### Key Components + - **`src/index.js`**: Entry point exposing `runTests()` function - **`src/tests.js`**: Core test runner with Appium/WebDriver orchestration (600+ LOC orchestrator) - **`src/config.js`**: Configuration validation, environment detection, browser discovery @@ -22,6 +25,7 @@ Doc Detective Core is a low-code documentation testing framework that validates ## Critical Workflows ### Running Tests Locally + ```bash npm test # Run full test suite (mocha) node dev # Development/manual testing @@ -29,9 +33,11 @@ npm run depcheck # Check for unused dependencies ``` ### CI/CD Pipeline + Three GitHub Actions workflows automate releases and testing: 1. **Auto Dev Release** (`auto-dev-release.yml`): Triggers on push to `main` + - Skips on `[skip ci]` commits, release commits, or docs-only changes - Increments dev version (`3.4.0-dev.1` → `3.4.0-dev.2`) - Publishes to npm with `dev` tag @@ -39,6 +45,7 @@ Three GitHub Actions workflows automate releases and testing: - **Version strategy**: Checks npm for latest dev number, increments, updates `package.json`, commits with `[skip ci]`, creates git tag 2. **Test & Publish** (`npm-test.yaml`): Cross-platform testing + release publishing + - **Test matrix**: Ubuntu/Windows/macOS × Node 18/20/22/24 (15 min timeout) - **Triggers**: Push to `main`, PRs (opened/reopened/synced), manual dispatch - **On release publish**: Runs `npm publish` to npm registry @@ -51,18 +58,21 @@ Three GitHub Actions workflows automate releases and testing: - **Release notes**: Aggregates merged PRs since last tag + resolver release notes ### Browser Management + - **Post-install** (`scripts/postinstall.js`): Auto-downloads Chrome/Firefox/ChromeDriver to `browser-snapshots/` - Browsers MUST match platform (detected via `@puppeteer/browsers`) - Appium drivers installed: `chromium`, `gecko`, `safari` (Mac only) - **Timeout**: All drivers default to 10 minutes (`newCommandTimeout: 600`) ### Version Management + - **Dev releases**: `X.Y.Z-dev.N` format (auto-incremented on every main push) - **Stable releases**: Manual GitHub releases trigger npm publish - **Dependency sync**: Resolver updates trigger automated core updates - **Commit conventions**: Use `[skip ci]` to avoid triggering auto-dev-release ### Adding New Step Types + 1. Create handler in `src/tests/[actionName].js` exporting async function 2. Add action to `driverActions` array in `src/tests.js` if requires browser 3. Add case in `runStep()` switch statement @@ -72,53 +82,63 @@ Three GitHub Actions workflows automate releases and testing: ## Project Conventions ### Test Structure + Tests follow nested hierarchy: -``` + +```text spec (file) → test → context (browser/platform combo) → step (action) ``` + - **Contexts** run serially and skip if platform/browser unsupported - **Steps** skip after first failure in context (stepExecutionFailed flag) - **Unsafe steps** (`step.unsafe = true`) require `config.allowUnsafeSteps = true` ### Configuration Patterns + - Config validated via `doc-detective-common` schemas (`validate({ schemaKey: "config_v3", object })`) - File types (`markdown`, `asciidoc`, `html`) define inline test detection regexes - Environment variables loaded via `loadEnvs()` and replaced via `replaceEnvs()` using `$VAR_NAME` syntax - OpenAPI definitions loaded and dereferenced at config time (stored in `config.integrations.openApi[].definition`) ### Expression System (`src/expressions.js`) + - **Meta values**: `$$response.body.users[0].name` accesses runtime data - **Embedded expressions**: `"User ID is {{$$response.body.id}}"` for string interpolation - **Operators**: `jq($$response.body, ".users[0].name")`, `extract($$output, "ID: (\d+)")` - Variables set via `step.variables = { MY_VAR: "$$response.body.token" }` → stored as env vars ### OpenAPI Integration + - **Example compilation**: Extracts request/response examples from OpenAPI spec - **Schema validation**: Uses AJV to validate payloads against OpenAPI schemas - **Mock responses**: Set `step.httpRequest.openApi.mockResponse = true` to skip actual HTTP call - Operations referenced by `operationId` (e.g., `step.httpRequest.openApi.operationId = "getUserById"`) ### Error Handling & Logging + - Use `log(config, level, message)` where level = "debug"|"info"|"warning"|"error" - Config object MUST be passed as first param to log functions - Step failures should return `{ status: "FAIL", description: "Detailed error message" }` - Always handle driver cleanup in try/finally blocks ## Common Pitfalls + - **Appium must be running** for any driver-based step (auto-started if needed, but check `appiumRequired` flag) - **Browser paths are platform-specific**: Use `getAvailableApps()` to detect installed browsers - **JSON pointer syntax**: Use `#/path/to/field` after meta value (e.g., `$$response#/body/users/0/name`) - **Viewport vs Window size**: `setViewportSize()` calculates delta to set inner dimensions -- **Percentage variation** (`maxVariation`): Value is decimal (0.1 = 10%), but comparison uses percentage (multiply by 100) +- **Fractional variation** (`maxVariation`): Value is a decimal fraction (0.1 = 10% tolerance). Comparisons use fractions directly. - **File overwrite modes**: "false" (never), "true" (always), "aboveVariation" (only if content differs > maxVariation) ## Testing Patterns + - Tests in `test/core.test.js` use mocha with `this.timeout(0)` for indefinite timeout - Test server runs on port 8092 (`test/server/`) for HTTP request tests - Artifacts stored in `test/artifacts/` (specs, configs, test files) - Use `fs.writeFileSync()` + `fs.unlinkSync()` for temp test files in try/finally blocks ## Dependencies to Know + - `webdriverio` (8.45.0): WebDriver protocol implementation - `appium`: Browser automation server - `@puppeteer/browsers`: Browser binary management @@ -129,6 +149,7 @@ spec (file) → test → context (browser/platform combo) → step (action) - `doc-detective-resolver`: Test detection/resolution ## Documentation + - Main docs at https://doc-detective.com - Schemas at https://doc-detective.com/reference/schemas/ - Report issues to https://github.com/doc-detective/doc-detective-core/issues diff --git a/package-lock.json b/package-lock.json index 84bb61a..c71e9d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "doc-detective-core", - "version": "3.6.0", + "version": "3.6.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective-core", - "version": "3.6.0", + "version": "3.6.2", "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { @@ -16,11 +16,11 @@ "ajv": "^8.17.1", "appium": "^3.1.1", "appium-chromium-driver": "^2.0.3", - "appium-geckodriver": "^2.1.1", - "appium-safari-driver": "^4.1.0", + "appium-geckodriver": "^2.1.2", + "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", "doc-detective-common": "^3.6.0", - "doc-detective-resolver": "^3.6.0", + "doc-detective-resolver": "^3.6.1", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", @@ -1285,9 +1285,9 @@ } }, "node_modules/@posthog/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.6.0.tgz", - "integrity": "sha512-Tbh8UACwbb7jFdDC7wwXHtfNzO+4wKh3VbyMHmp2UBe6w1jliJixexTJNfkqdGZm+ht3M10mcKvGGPnoZ2zLBg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.0.tgz", + "integrity": "sha512-d6ZV4grpzeH/6/LP8quMVpSjY1puRkrqfwcPvGRKUAX7tb7YHyp/zMiTDuJmOFbpUxAMBXH5nDwcPiyCY2WGzA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.6" @@ -6698,9 +6698,9 @@ } }, "node_modules/appium-geckodriver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/appium-geckodriver/-/appium-geckodriver-2.1.1.tgz", - "integrity": "sha512-+/RXmDgbPACzNTzbYGyUm/vLJSvlY2ehg6BU0fNycjBURv9Nmp07nNOUcfWQ99aR6OnoETeQNTgrl8qM8DXVug==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/appium-geckodriver/-/appium-geckodriver-2.1.2.tgz", + "integrity": "sha512-Dx7l8+Z+enL7LsaDbDhNRIflUH/9ve7H3TLzF09OVGoMZJW/yoYih9zzxF+gZy8YIDymbf7LloyRH0d/65BiIg==", "hasShrinkwrap": true, "license": "Apache-2.0", "dependencies": { @@ -8829,9 +8829,9 @@ "peer": true }, "node_modules/appium-geckodriver/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "peer": true, "dependencies": { @@ -8843,7 +8843,11 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-geckodriver/node_modules/find-up": { @@ -11697,9 +11701,9 @@ } }, "node_modules/appium-safari-driver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/appium-safari-driver/-/appium-safari-driver-4.1.0.tgz", - "integrity": "sha512-dC+A+W9gwKOEDeogfAwtLVieYk7KfldJ52ac8bZvws5pfMFOCSiuUhvtSClujnxcalb/zLBhnIeijCsWq3V3SA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/appium-safari-driver/-/appium-safari-driver-4.1.2.tgz", + "integrity": "sha512-VwN69pQclAvw9EKrS2Ga48dZY2eRaYfcGaPMvKL2TIyxat/PUkt+xpV1s8JegLkI0s68iAW+gI7bNuxZpGFSwg==", "hasShrinkwrap": true, "license": "Apache-2.0", "dependencies": { @@ -11997,9 +12001,8 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "extraneous": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -12038,29 +12041,6 @@ "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", @@ -12078,423 +12058,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, "node_modules/appium-safari-driver/node_modules/@isaacs/balanced-match": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", @@ -13934,9 +13497,9 @@ "peer": true }, "node_modules/appium-safari-driver/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "peer": true, "dependencies": { @@ -13948,7 +13511,11 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-safari-driver/node_modules/find-up": { @@ -15030,9 +14597,9 @@ } }, "node_modules/appium-safari-driver/node_modules/node-simctl": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-8.0.6.tgz", - "integrity": "sha512-NsoaB+I/qPwfkyCUYWD03CEQwk07UQcs9YYXp8++qQCBFazLabY1tSQXXapGx4r72BStQtS14rJr4qt3VEE5Lg==", + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-8.0.8.tgz", + "integrity": "sha512-5aFcGmKz5OlUj3Rd464Cd2gewN0UsmptdEC4B7NIyYCbF7eD1u224HYmsds2VUz+/OssaaXSEWIcAeoXVgSM+g==", "license": "Apache-2.0", "dependencies": { "@appium/logger": "^2.0.0-rc.1", @@ -15044,13 +14611,28 @@ "source-map-support": "^0.x", "teen_process": "^3.0.0", "uuid": "^13.0.0", - "which": "^5.0.0" + "which": "^6.0.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", "npm": ">=10" } }, + "node_modules/appium-safari-driver/node_modules/node-simctl/node_modules/which": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/appium-safari-driver/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -16416,9 +15998,9 @@ } }, "node_modules/appium-safari-driver/node_modules/teen_process": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.3.tgz", - "integrity": "sha512-pYAojbLkaqXHpgze5AEdchW71OKownDPpqYpLTQsU/pUGMv3zr4yo2mSv/NnRAkRmsrNF2BP9byh2MVk9Y5H9A==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.4.tgz", + "integrity": "sha512-NQA/5PdJWEAxuYoBRW7RajnAyWmfh5iGMY1kEXiAzobtv0ztERcfDnfszpUTuvhFXrvh3E4GvHt9yWbS/EndzQ==", "license": "Apache-2.0", "dependencies": { "bluebird": "^3.7.2", @@ -16489,9 +16071,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true, - "peer": true + "extraneous": true, + "license": "0BSD" }, "node_modules/appium-safari-driver/node_modules/type-fest": { "version": "5.2.0", @@ -16618,6 +16199,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "license": "ISC", + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -18397,9 +17979,9 @@ } }, "node_modules/doc-detective-resolver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.6.0.tgz", - "integrity": "sha512-PzryeAbzU76s4iRaFVCTbdMyRyecs1bb+zN/XfE60B6oYNxcFWgGA1T+MmXM9fS47ITv5I0zOatLnvHEpJph+Q==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.6.1.tgz", + "integrity": "sha512-8loBGZctT4JWo5PgjYk9b4ZRyJy/Od33KKd5Q+Sa/XEiaQ0e6602e9oI/JDfmnaB1KGUi9qTigezRLIMQlH+Dw==", "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", @@ -18408,7 +17990,7 @@ "doc-detective-common": "^3.6.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.15.0" + "posthog-node": "^5.17.0" } }, "node_modules/dom-serializer": { @@ -21453,12 +21035,12 @@ } }, "node_modules/posthog-node": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.15.0.tgz", - "integrity": "sha512-Q70DGmUoy/Lavrq+qn2shIj/EQSeyaz6huIZQlLE6y8Xa6xtZw+Jg1lyr2nC1sEEFPCU1X7zkNvP6mjbYwqjYA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.0.tgz", + "integrity": "sha512-M+ftj0kLJk6wVF1xW5cStSany0LBC6YDVO7RPma2poo+PrpeiTk+ovhqcIqWAySDdTcBHJfBV9aIFYWPl2y6kg==", "license": "MIT", "dependencies": { - "@posthog/core": "1.6.0" + "@posthog/core": "1.7.0" }, "engines": { "node": ">=20" diff --git a/package.json b/package.json index 196bf53..d1d0c53 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective-core", - "version": "3.6.0", + "version": "3.6.2", "description": "The doc testing framework.", "main": "src/index.js", "scripts": { @@ -33,11 +33,11 @@ "ajv": "^8.17.1", "appium": "^3.1.1", "appium-chromium-driver": "^2.0.3", - "appium-geckodriver": "^2.1.1", - "appium-safari-driver": "^4.1.0", + "appium-geckodriver": "^2.1.2", + "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", "doc-detective-common": "^3.6.0", - "doc-detective-resolver": "^3.6.0", + "doc-detective-resolver": "^3.6.1", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", diff --git a/src/tests.js b/src/tests.js index cd0c3f8..5787966 100644 --- a/src/tests.js +++ b/src/tests.js @@ -877,7 +877,7 @@ async function runStep({ driver: driver, }); } else if (typeof step.wait !== "undefined") { - actionResult = await wait({ step: step }); + actionResult = await wait({ step: step, driver: driver }); } else { actionResult = { status: "FAIL", diff --git a/src/tests/httpRequest.js b/src/tests/httpRequest.js index e895afe..b2a8fcb 100644 --- a/src/tests/httpRequest.js +++ b/src/tests/httpRequest.js @@ -4,7 +4,7 @@ const fs = require("fs"); const path = require("path"); const Ajv = require("ajv"); const { getOperation, loadDescription } = require("../openapi"); -const { log, calculatePercentageDifference, replaceEnvs } = require("../utils"); +const { log, calculateFractionalDifference, replaceEnvs } = require("../utils"); exports.httpRequest = httpRequest; @@ -302,16 +302,18 @@ async function httpRequest({ config, step, openApiDefinitions = [] }) { // Validate required fields in response if (step.httpRequest.response?.required?.length > 0) { const missingFields = []; - + for (const fieldPath of step.httpRequest.response.required) { if (!fieldExistsAtPath(response.data, fieldPath)) { missingFields.push(fieldPath); } } - + if (missingFields.length > 0) { result.status = "FAIL"; - result.description += ` Missing required fields: ${missingFields.join(", ")}`; + result.description += ` Missing required fields: ${missingFields.join( + ", " + )}`; return result; } } @@ -451,31 +453,35 @@ async function httpRequest({ config, step, openApiDefinitions = [] }) { // Read existing file const existingFile = fs.readFileSync(filePath, "utf8"); - // Calculate percentage diff between existing file content and command output content, not length - const percentDiff = calculatePercentageDifference( + // Calculate fractional diff between existing file content and command output content, not length + const fractionalDiff = calculateFractionalDifference( existingFile, JSON.stringify(response.data, null, 2) ); - log(config, "debug", `Percentage difference: ${percentDiff}%`); + log(config, "debug", `Fractional difference: ${fractionalDiff}`); - if (percentDiff > step.httpRequest.maxVariation * 100) { + if (fractionalDiff > step.httpRequest.maxVariation) { if (step.httpRequest.overwrite == "aboveVariation") { // Overwrite file await fs.promises.writeFile( filePath, JSON.stringify(response.data, null, 2) ); + result.description += ` Saved response to file.`; } - result.status = "FAIL"; - result.description += ` The percentage difference between the existing file content and command output content (${percentDiff}%) is greater than the max accepted variation (${ - step.httpRequest.maxVariation * 100 - }%).`; + result.status = "WARNING"; + result.description += ` The difference between the existing saved response and the new response (${fractionalDiff.toFixed( + 2 + )}) is greater than the max accepted variation (${ + step.httpRequest.maxVariation + }).`; return result; } if (step.httpRequest.overwrite == "true") { // Overwrite file fs.writeFileSync(filePath, JSON.stringify(response.data, null, 2)); + result.description += ` Saved response to file.`; } } } @@ -487,7 +493,7 @@ async function httpRequest({ config, step, openApiDefinitions = [] }) { /** * Checks if a field exists at the specified path in an object. * Supports dot notation and array indices. - * + * * @param {Object} obj - The object to search * @param {string} path - The field path (e.g., "user.profile.name" or "items[0].id") * @returns {boolean} - True if the field exists, false otherwise @@ -496,13 +502,13 @@ function fieldExistsAtPath(obj, path) { // Parse the path into segments // Handle both dot notation and array brackets const segments = path.match(/[^.[\]]+/g); - + if (!segments) { return false; } - + let current = obj; - + // Traverse each segment for (const segment of segments) { // Treat as array index only if the segment is purely numeric (e.g., "0", "12") @@ -516,13 +522,17 @@ function fieldExistsAtPath(obj, path) { } else { // Object property access // Use 'in' operator to check existence (works for null/undefined values) - if (typeof current !== 'object' || current === null || !(segment in current)) { + if ( + typeof current !== "object" || + current === null || + !(segment in current) + ) { return false; } current = current[segment]; } } - + return true; } diff --git a/src/tests/runShell.js b/src/tests/runShell.js index ee2cce0..8e1925e 100644 --- a/src/tests/runShell.js +++ b/src/tests/runShell.js @@ -2,7 +2,7 @@ const { validate } = require("doc-detective-common"); const { spawnCommand, log, - calculatePercentageDifference, + calculateFractionalDifference, } = require("../utils"); const fs = require("fs"); const path = require("path"); @@ -94,7 +94,10 @@ async function runShell({ config, step }) { step.runShell.stdio.endsWith("/") ) { const regex = new RegExp(step.runShell.stdio.slice(1, -1)); - if (!regex.test(result.outputs.stdio.stdout) && !regex.test(result.outputs.stdio.stderr)) { + if ( + !regex.test(result.outputs.stdio.stdout) && + !regex.test(result.outputs.stdio.stderr) + ) { result.status = "FAIL"; result.description = `Couldn't find expected output (${step.runShell.stdio}) in actual output (stdout or stderr).`; } @@ -134,28 +137,34 @@ async function runShell({ config, step }) { // Read existing file const existingFile = fs.readFileSync(filePath, "utf8"); - // Calculate percentage diff between existing file content and command output content, not length - const percentDiff = calculatePercentageDifference( + // Calculate fractional diff between existing file content and command output content, not length + const fractionalDiff = calculateFractionalDifference( existingFile, result.outputs.stdio.stdout ); - log(config, "debug", `Percentage difference: ${percentDiff}%`); + log(config, "debug", `Fractional difference: ${fractionalDiff}`); - if (percentDiff > step.runShell.maxVariation) { + if (fractionalDiff > step.runShell.maxVariation) { if (step.runShell.overwrite == "aboveVariation") { // Overwrite file fs.writeFileSync(filePath, result.outputs.stdio.stdout); + result.description += ` Saved output to file.`; } result.status = "WARNING"; result.description = result.description + - ` The percentage difference between the existing file content and command output content (${percentDiff}%) is greater than the max accepted variation (${step.runShell.maxVariation}%).`; + ` The difference between the existing output and the new output (${fractionalDiff.toFixed( + 2 + )}) is greater than the max accepted variation (${ + step.runShell.maxVariation + }).`; return result; } if (step.runShell.overwrite == "true") { // Overwrite file fs.writeFileSync(filePath, result.outputs.stdio.stdout); + result.description += ` Saved output to file.`; } } } diff --git a/src/tests/saveScreenshot.js b/src/tests/saveScreenshot.js index 0000652..b339df6 100644 --- a/src/tests/saveScreenshot.js +++ b/src/tests/saveScreenshot.js @@ -130,7 +130,10 @@ async function saveScreenshot({ config, step, driver }) { } if (element) result.outputs.element = findResult.outputs.element; // Determine if element bounding box + padding is within viewport - const rect = { ...(await element.getLocation()), ...(await element.getSize()) }; + const rect = { + ...(await element.getLocation()), + ...(await element.getSize()), + }; const viewport = await driver.execute(() => { return { width: window.innerWidth, @@ -162,13 +165,17 @@ async function saveScreenshot({ config, step, driver }) { // Scroll element into view at top-left with padding await driver.execute( (el, pad) => { - el.scrollIntoView({ block: "start", inline: "start", behavior: "instant" }); + el.scrollIntoView({ + block: "start", + inline: "start", + behavior: "instant", + }); window.scrollBy(-pad.left, -pad.top); }, element, padding ); - + // Wait for scroll to complete await driver.pause(100); } @@ -217,7 +224,7 @@ async function saveScreenshot({ config, step, driver }) { x: bounds.left, y: bounds.top, width: bounds.width, - height: bounds.height + height: bounds.height, }; }, element); log(config, "debug", { rect }); @@ -286,7 +293,7 @@ async function saveScreenshot({ config, step, driver }) { fs.renameSync(filePath, existFilePath); return result; } - let percentDiff; + let fractionalDiff; // Perform numerical pixel diff with pixelmatch if (step.screenshot.maxVariation) { @@ -336,28 +343,30 @@ async function saveScreenshot({ config, step, driver }) { height, { threshold: 0.0005 } ); - percentDiff = (numDiffPixels / (width * height)) * 100; + fractionalDiff = numDiffPixels / (width * height); log(config, "debug", { totalPixels: width * height, numDiffPixels, - percentDiff, + fractionalDiff, }); - if (percentDiff > step.screenshot.maxVariation) { + if (fractionalDiff > step.screenshot.maxVariation) { if (step.screenshot.overwrite == "aboveVariation") { // Replace old file with new file fs.renameSync(filePath, existFilePath); } result.status = "WARNING"; - result.description += ` Screenshots are beyond maximum accepted variation: ${percentDiff.toFixed( + result.description += ` The difference between the existing screenshot and new screenshot (${fractionalDiff.toFixed( 2 - )}%.`; + )}) is greater than the max accepted variation (${ + step.screenshot.maxVariation + }).`; return result; } else { - result.description += ` Screenshots are within maximum accepted variation: ${percentDiff.toFixed( + result.description += ` Screenshots are within maximum accepted variation: ${fractionalDiff.toFixed( 2 - )}%.`; + )}.`; if (step.screenshot.overwrite != "true") { fs.unlinkSync(filePath); } diff --git a/src/tests/wait.js b/src/tests/wait.js index c84a646..c78b8e2 100644 --- a/src/tests/wait.js +++ b/src/tests/wait.js @@ -2,8 +2,9 @@ const { validate } = require("doc-detective-common"); exports.wait = wait; -// Open a URI in the browser -async function wait({ step }) { +// Wait for a specified duration +// Uses driver.pause() when a driver is available for proper browser synchronization +async function wait({ step, driver }) { let result = { status: "PASS", description: "Waited." }; // Validate step payload @@ -36,7 +37,15 @@ async function wait({ step }) { // Run action try { - await new Promise((r) => setTimeout(r, step.wait)); + // Use driver.pause() when a driver is available for proper browser synchronization. + // This ensures the WebDriver session stays in sync with the browser's actual state, + // which is critical for finding elements that are dynamically rendered by JavaScript. + // A simple setTimeout() only pauses Node.js and can leave the WebDriver session stale. + if (driver) { + await driver.pause(step.wait); + } else { + await new Promise((r) => setTimeout(r, step.wait)); + } } catch (error) { // FAIL: Error waiting result.status = "FAIL"; diff --git a/src/utils.js b/src/utils.js index a143ea8..3aa545e 100644 --- a/src/utils.js +++ b/src/utils.js @@ -12,7 +12,7 @@ exports.replaceEnvs = replaceEnvs; exports.spawnCommand = spawnCommand; exports.inContainer = inContainer; exports.cleanTemp = cleanTemp; -exports.calculatePercentageDifference = calculatePercentageDifference; +exports.calculateFractionalDifference = calculateFractionalDifference; exports.fetchFile = fetchFile; exports.isRelativeUrl = isRelativeUrl; @@ -264,11 +264,20 @@ async function inContainer() { return false; } -function calculatePercentageDifference(text1, text2) { +/** + * Calculates the fractional difference between two strings using Levenshtein distance. + * @param {string} text1 - First string to compare + * @param {string} text2 - Second string to compare + * @returns {number} Fractional difference between 0 and 1, where 0 means identical + * and 1 means completely different. Compare against maxVariation + * thresholds directly (e.g., 0.1 for 10% tolerance). + */ +function calculateFractionalDifference(text1, text2) { const distance = llevenshteinDistance(text1, text2); const maxLength = Math.max(text1.length, text2.length); - const percentageDiff = (distance / maxLength) * 100; - return percentageDiff.toFixed(2); // Returns the percentage difference as a string with two decimal places + if (maxLength === 0) return 0; // Both strings are empty + const fractionalDiff = distance / maxLength; + return fractionalDiff; } function llevenshteinDistance(s, t) { diff --git a/test/artifacts/wait-with-driver.spec.json b/test/artifacts/wait-with-driver.spec.json new file mode 100644 index 0000000..b50e90e --- /dev/null +++ b/test/artifacts/wait-with-driver.spec.json @@ -0,0 +1,59 @@ +{ + "id": "Test wait action with browser driver", + "contexts": [ + { + "app": { "name": "firefox", "options": { "headless": true } }, + "platforms": ["windows", "mac", "linux"] + } + ], + "tests": [ + { + "testId": "wait-with-driver-milliseconds", + "description": "Test wait action with driver using milliseconds", + "steps": [ + { + "goTo": "http://localhost:8092/waitUntil-test-static.html" + }, + { + "wait": 100 + } + ] + }, + { + "testId": "wait-with-driver-boolean-true", + "description": "Test wait action with driver using boolean true (defaults to 5000ms)", + "steps": [ + { + "goTo": "http://localhost:8092/waitUntil-test-static.html" + }, + { + "wait": true + } + ] + }, + { + "testId": "wait-with-driver-string-number", + "description": "Test wait action with driver using string number", + "steps": [ + { + "goTo": "http://localhost:8092/waitUntil-test-static.html" + }, + { + "wait": "100" + } + ] + }, + { + "testId": "wait-with-driver-skip-false", + "description": "Test wait action with driver using false (should skip)", + "steps": [ + { + "goTo": "http://localhost:8092/waitUntil-test-static.html" + }, + { + "wait": false + } + ] + } + ] +} From 784459fc51433ae6546746d6935c153b23ca842e Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 4 Dec 2025 17:15:56 -0800 Subject: [PATCH 02/90] Squashed 'resolver/' changes from 0b62b5e9..6ef908c0 6ef908c0 Set releae version [skip ci] cc6e1159 Auto dev release: v3.6.0-dev.1 [skip ci] 79e02b48 Add support for additional CommonMark syntax variations and improve JSON parsing (#93) git-subtree-dir: resolver git-subtree-split: 6ef908c06cc9ee921a8ca2c96d580ef04e107342 --- dev/doc-content.md | 30 ++- dev/index.js | 2 +- package-lock.json | 20 +- package.json | 4 +- src/config.js | 33 ++- src/config.test.js | 2 +- src/index.test.js | 526 +++++++++++++++++++++++++++++++++++++++++++++ src/utils.js | 34 ++- 8 files changed, 623 insertions(+), 28 deletions(-) diff --git a/dev/doc-content.md b/dev/doc-content.md index 1cc3d3a..21f2d0c 100644 --- a/dev/doc-content.md +++ b/dev/doc-content.md @@ -1,11 +1,19 @@ -``` -PATCH https://orc.wiremockapi.cloud/satellites/8 HTTP/1.1 -Host: orc.wiremockapi.cloud -Content-Type: application/json -Accept: application/json -Content-Length: 25 - -{ - "status": "maintenance" -} -``` \ No newline at end of file +[comment]: # 'test {"testId": "uppercase-conversion", "detectSteps": false}' + +1. Open the app at [http://localhost:3000](http://localhost:3000). + +[comment]: # 'step {"goTo": "http://localhost:3000"}' + +2. Type "hello world" in the input field. + +[comment]: # 'step {"find": {"selector": "#input", "click": true}}' +[comment]: # 'step {"type": "hello world"}' + +3. Click **Convert to Uppercase**. + +[comment]: # 'step {"find": {"selector": "button", "click": true}}' + +4. You'll see **HELLO WORLD** in the output. + +[comment]: # 'step {"find": "HELLO WORLD"}' +[comment]: # "test end" diff --git a/dev/index.js b/dev/index.js index 847624b..904d685 100644 --- a/dev/index.js +++ b/dev/index.js @@ -12,7 +12,7 @@ main(); */ async function main() { const json = { - input: "dev/doc-content.dita", + input: "dev/doc-content.md", logLevel: "debug", runOn: [ { diff --git a/package-lock.json b/package-lock.json index b7120d1..5cf2118 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "doc-detective-resolver", - "version": "3.6.0", + "version": "3.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective-resolver", - "version": "3.6.0", + "version": "3.6.1", "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", @@ -15,7 +15,7 @@ "doc-detective-common": "^3.6.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.15.0" + "posthog-node": "^5.17.0" }, "devDependencies": { "body-parser": "^2.2.1", @@ -124,9 +124,9 @@ } }, "node_modules/@posthog/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.6.0.tgz", - "integrity": "sha512-Tbh8UACwbb7jFdDC7wwXHtfNzO+4wKh3VbyMHmp2UBe6w1jliJixexTJNfkqdGZm+ht3M10mcKvGGPnoZ2zLBg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.0.tgz", + "integrity": "sha512-d6ZV4grpzeH/6/LP8quMVpSjY1puRkrqfwcPvGRKUAX7tb7YHyp/zMiTDuJmOFbpUxAMBXH5nDwcPiyCY2WGzA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.6" @@ -1789,12 +1789,12 @@ "license": "ISC" }, "node_modules/posthog-node": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.15.0.tgz", - "integrity": "sha512-Q70DGmUoy/Lavrq+qn2shIj/EQSeyaz6huIZQlLE6y8Xa6xtZw+Jg1lyr2nC1sEEFPCU1X7zkNvP6mjbYwqjYA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.0.tgz", + "integrity": "sha512-M+ftj0kLJk6wVF1xW5cStSany0LBC6YDVO7RPma2poo+PrpeiTk+ovhqcIqWAySDdTcBHJfBV9aIFYWPl2y6kg==", "license": "MIT", "dependencies": { - "@posthog/core": "1.6.0" + "@posthog/core": "1.7.0" }, "engines": { "node": ">=20" diff --git a/package.json b/package.json index 8e6fb29..da39660 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective-resolver", - "version": "3.6.0", + "version": "3.6.1", "description": "Detect and resolve docs into Doc Detective tests.", "main": "src/index.js", "scripts": { @@ -30,7 +30,7 @@ "doc-detective-common": "^3.6.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.15.0" + "posthog-node": "^5.17.0" }, "devDependencies": { "body-parser": "^2.2.1", diff --git a/src/config.js b/src/config.js index 72eb211..8bacb3a 100644 --- a/src/config.js +++ b/src/config.js @@ -320,26 +320,57 @@ let defaultFileTypes = { testStart: [ "{\\/\\*\\s*test\\s+?([\\s\\S]*?)\\s*\\*\\/}", "", + // CommonMark comment syntax with parentheses: [comment]: # (test ...) "\\[comment\\]:\\s+#\\s+\\(test\\s*(.*?)\\s*\\)", "\\[comment\\]:\\s+#\\s+\\(test start\\s*(.*?)\\s*\\)", + // CommonMark comment syntax with single quotes: [comment]: # 'test ...' + "\\[comment\\]:\\s+#\\s+'test\\s*(.*?)\\s*'", + "\\[comment\\]:\\s+#\\s+'test start\\s*(.*?)\\s*'", + // CommonMark comment syntax with double quotes: [comment]: # "test ..." + // Uses (?:[^"\\\\]|\\\\.)* to handle escaped quotes within the content + '\\[comment\\]:\\s+#\\s+"test\\s*((?:[^"\\\\]|\\\\.)*)\\s*"', + '\\[comment\\]:\\s+#\\s+"test start\\s*((?:[^"\\\\]|\\\\.)*)\\s*"', ], testEnd: [ "{\\/\\*\\s*test end\\s*\\*\\/}", "", + // CommonMark comment syntax with parentheses "\\[comment\\]:\\s+#\\s+\\(test end\\)", + // CommonMark comment syntax with single quotes + "\\[comment\\]:\\s+#\\s+'test end'", + // CommonMark comment syntax with double quotes + '\\[comment\\]:\\s+#\\s+"test end"', ], ignoreStart: [ "{\\/\\*\\s*test ignore start\\s*\\*\\/}", "", + // CommonMark comment syntax with parentheses + "\\[comment\\]:\\s+#\\s+\\(test ignore start\\)", + // CommonMark comment syntax with single quotes + "\\[comment\\]:\\s+#\\s+'test ignore start'", + // CommonMark comment syntax with double quotes + '\\[comment\\]:\\s+#\\s+"test ignore start"', ], ignoreEnd: [ "{\\/\\*\\s*test ignore end\\s*\\*\\/}", "", + // CommonMark comment syntax with parentheses + "\\[comment\\]:\\s+#\\s+\\(test ignore end\\)", + // CommonMark comment syntax with single quotes + "\\[comment\\]:\\s+#\\s+'test ignore end'", + // CommonMark comment syntax with double quotes + '\\[comment\\]:\\s+#\\s+"test ignore end"', ], step: [ "{\\/\\*\\s*step\\s+?([\\s\\S]*?)\\s*\\*\\/}", "", + // CommonMark comment syntax with parentheses: [comment]: # (step ...) "\\[comment\\]:\\s+#\\s+\\(step\\s*(.*?)\\s*\\)", + // CommonMark comment syntax with single quotes: [comment]: # 'step ...' + "\\[comment\\]:\\s+#\\s+'step\\s*(.*?)\\s*'", + // CommonMark comment syntax with double quotes: [comment]: # "step ..." + // Uses (?:[^"\\\\]|\\\\.)* to handle escaped quotes within the content + '\\[comment\\]:\\s+#\\s+"step\\s*((?:[^"\\\\]|\\\\.)*)\\s*"', ], }, markup: [ @@ -472,7 +503,7 @@ async function setConfig({ config }) { } catch (error) { log( config, - "warn", + "warning", `Invalid JSON in DOC_DETECTIVE environment variable: ${error.message}. Ignoring config overrides.` ); } diff --git a/src/config.test.js b/src/config.test.js index 3880c5b..decedb1 100644 --- a/src/config.test.js +++ b/src/config.test.js @@ -81,7 +81,7 @@ describe("envMerge", function () { // Should continue normally without applying overrides expect(validStub.calledOnce).to.be.true; - expect(logStub.calledWith(sinon.match.any, "warn", sinon.match.string)).to.be.true; + expect(logStub.calledWith(sinon.match.any, "warning", sinon.match.string)).to.be.true; }); it("should handle DOC_DETECTIVE environment variable without config property", async function () { diff --git a/src/index.test.js b/src/index.test.js index de8c1c1..0e8ed35 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -885,3 +885,529 @@ detectSteps: true expect(codeblockStep).to.exist; }); }); + +// CommonMark comment syntax test inputs - JSON syntax +const markdownParenthesesComments = ` +[comment]: # (test {"testId": "parentheses-test", "detectSteps": false}) + +1. Open the app at [http://localhost:3000](http://localhost:3000). + +[comment]: # (step {"goTo": "http://localhost:3000"}) + +2. Type "hello world" in the input field. + +[comment]: # (step {"find": {"selector": "#input", "click": true}}) +[comment]: # (step {"type": "hello world"}) + +3. Click **Convert to Uppercase**. + +[comment]: # (step {"find": {"selector": "button", "click": true}}) + +4. You'll see **HELLO WORLD** in the output. + +[comment]: # (step {"find": "HELLO WORLD"}) +[comment]: # (test end) +`; + +const markdownSingleQuoteComments = ` +[comment]: # 'test {"testId": "single-quote-test", "detectSteps": false}' + +1. Open the app at [http://localhost:3000](http://localhost:3000). + +[comment]: # 'step {"goTo": "http://localhost:3000"}' + +2. Type "hello world" in the input field. + +[comment]: # 'step {"find": {"selector": "#input", "click": true}}' +[comment]: # 'step {"type": "hello world"}' + +3. Click **Convert to Uppercase**. + +[comment]: # 'step {"find": {"selector": "button", "click": true}}' + +4. You'll see **HELLO WORLD** in the output. + +[comment]: # 'step {"find": "HELLO WORLD"}' +[comment]: # 'test end' +`; + +const markdownDoubleQuoteComments = ` +[comment]: # "test {\\"testId\\": \\"double-quote-test\\", \\"detectSteps\\": false}" + +1. Open the app at [http://localhost:3000](http://localhost:3000). + +[comment]: # "step {\\"goTo\\": \\"http://localhost:3000\\"}" + +2. Type "hello world" in the input field. + +[comment]: # "step {\\"find\\": {\\"selector\\": \\"#input\\", \\"click\\": true}}" +[comment]: # "step {\\"type\\": \\"hello world\\"}" + +3. Click **Convert to Uppercase**. + +[comment]: # "step {\\"find\\": {\\"selector\\": \\"button\\", \\"click\\": true}}" + +4. You'll see **HELLO WORLD** in the output. + +[comment]: # "step {\\"find\\": \\"HELLO WORLD\\"}" +[comment]: # "test end" +`; + +const markdownMixedQuoteComments = ` +[comment]: # (test {"testId": "mixed-quote-test", "detectSteps": false}) + +1. Open the app at [http://localhost:3000](http://localhost:3000). + +[comment]: # 'step {"goTo": "http://localhost:3000"}' + +2. Type "hello world" in the input field. + +[comment]: # "step {\\"find\\": {\\"selector\\": \\"#input\\", \\"click\\": true}}" +[comment]: # (step {"type": "hello world"}) + +3. Click **Convert to Uppercase**. + +[comment]: # 'step {"find": {"selector": "button", "click": true}}' + +4. You'll see **HELLO WORLD** in the output. + +[comment]: # (step {"find": "HELLO WORLD"}) +[comment]: # "test end" +`; + +const markdownIgnoreSyntax = ` +[comment]: # (test {"testId": "ignore-syntax-test", "detectSteps": true}) + +This text should be detected. + +**Visible text** + +[comment]: # 'test ignore start' + +**Ignored text that should not be detected** + +[comment]: # 'test ignore end' + +**More visible text** + +[comment]: # "test end" +`; + +describe("CommonMark Comment Syntax Tests", function () { + it("should correctly parse markdown with parentheses syntax: [comment]: # (test ...)", async function () { + const tempFile = "temp_parentheses.md"; + fs.writeFileSync(tempFile, markdownParenthesesComments.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("parentheses-test"); + expect(results.specs[0].tests[0].detectSteps).to.equal(false); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(5); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("find").that.deep.includes({ selector: "#input", click: true }); + expect(steps[2]).to.have.property("type").that.equals("hello world"); + expect(steps[3]).to.have.property("find").that.deep.includes({ selector: "button", click: true }); + expect(steps[4]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly parse markdown with single quote syntax: [comment]: # 'test ...'", async function () { + const tempFile = "temp_single_quote.md"; + fs.writeFileSync(tempFile, markdownSingleQuoteComments.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("single-quote-test"); + expect(results.specs[0].tests[0].detectSteps).to.equal(false); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(5); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("find").that.deep.includes({ selector: "#input", click: true }); + expect(steps[2]).to.have.property("type").that.equals("hello world"); + expect(steps[3]).to.have.property("find").that.deep.includes({ selector: "button", click: true }); + expect(steps[4]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly parse markdown with double quote syntax: [comment]: # \"test ...\"", async function () { + const tempFile = "temp_double_quote.md"; + fs.writeFileSync(tempFile, markdownDoubleQuoteComments.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("double-quote-test"); + expect(results.specs[0].tests[0].detectSteps).to.equal(false); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(5); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("find").that.deep.includes({ selector: "#input", click: true }); + expect(steps[2]).to.have.property("type").that.equals("hello world"); + expect(steps[3]).to.have.property("find").that.deep.includes({ selector: "button", click: true }); + expect(steps[4]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly parse markdown with mixed quote syntaxes in same file", async function () { + const tempFile = "temp_mixed_quote.md"; + fs.writeFileSync(tempFile, markdownMixedQuoteComments.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("mixed-quote-test"); + expect(results.specs[0].tests[0].detectSteps).to.equal(false); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(5); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("find").that.deep.includes({ selector: "#input", click: true }); + expect(steps[2]).to.have.property("type").that.equals("hello world"); + expect(steps[3]).to.have.property("find").that.deep.includes({ selector: "button", click: true }); + expect(steps[4]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly handle ignore start/end with different quote syntaxes", async function () { + const tempFile = "temp_ignore_syntax.md"; + fs.writeFileSync(tempFile, markdownIgnoreSyntax.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("ignore-syntax-test"); + + // NOTE: The ignore functionality is currently not implemented (the ignore variable + // is set but not used to filter detected steps). This test validates that the + // ignore start/end patterns with different quote syntaxes are at least recognized. + // When ignore filtering is implemented, update this test to verify ignored content + // is excluded from detected steps. + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array"); + // Currently all bold text is detected (ignore not implemented) + expect(steps.length).to.be.greaterThan(0); + }); +}); + +// CommonMark comment syntax with YAML content +const markdownParenthesesYaml = ` +[comment]: # (test testId: parentheses-yaml-test) + +1. Open the app. + +[comment]: # (step goTo: "http://localhost:3000") + +2. Type in the field. + +[comment]: # (step type: hello world) + +3. You'll see the output. + +[comment]: # (step find: HELLO WORLD) +[comment]: # (test end) +`; + +const markdownSingleQuoteYaml = ` +[comment]: # 'test testId: single-quote-yaml-test' + +1. Open the app. + +[comment]: # 'step goTo: "http://localhost:3000"' + +2. Type in the field. + +[comment]: # 'step type: hello world' + +3. You'll see the output. + +[comment]: # 'step find: HELLO WORLD' +[comment]: # 'test end' +`; + +const markdownDoubleQuoteYaml = ` +[comment]: # "test testId: double-quote-yaml-test" + +1. Open the app. + +[comment]: # "step goTo: http://localhost:3000" + +2. Type in the field. + +[comment]: # "step type: hello world" + +3. You'll see the output. + +[comment]: # "step find: HELLO WORLD" +[comment]: # "test end" +`; + +// CommonMark comment syntax with XML attribute content +const markdownParenthesesXml = ` +[comment]: # (test testId="parentheses-xml-test" detectSteps=false) + +1. Open the app. + +[comment]: # (step goTo="http://localhost:3000") + +2. Type in the field. + +[comment]: # (step type="hello world") + +3. Wait for result. + +[comment]: # (step wait=500) + +4. You'll see the output. + +[comment]: # (step find="HELLO WORLD") +[comment]: # (test end) +`; + +const markdownSingleQuoteXml = ` +[comment]: # 'test testId="single-quote-xml-test" detectSteps=false' + +1. Open the app. + +[comment]: # 'step goTo="http://localhost:3000"' + +2. Type in the field. + +[comment]: # 'step type="hello world"' + +3. Wait for result. + +[comment]: # 'step wait=500' + +4. You'll see the output. + +[comment]: # 'step find="HELLO WORLD"' +[comment]: # 'test end' +`; + +const markdownDoubleQuoteXml = ` +[comment]: # "test testId='double-quote-xml-test' detectSteps=false" + +1. Open the app. + +[comment]: # "step goTo='http://localhost:3000'" + +2. Type in the field. + +[comment]: # "step type='hello world'" + +3. Wait for result. + +[comment]: # "step wait=500" + +4. You'll see the output. + +[comment]: # "step find='HELLO WORLD'" +[comment]: # "test end" +`; + +// CommonMark with XML dot notation +const markdownParenthesesXmlDotNotation = ` +[comment]: # (test testId="parentheses-xml-dot-test" detectSteps=false) + +1. Make an API call. + +[comment]: # (step httpRequest.url="https://example.com/api" httpRequest.method="GET") + +2. Another call. + +[comment]: # (step httpRequest.url="https://example.com/submit" httpRequest.method="POST" httpRequest.request.body="test") +[comment]: # (test end) +`; + +const markdownSingleQuoteXmlDotNotation = ` +[comment]: # 'test testId="single-quote-xml-dot-test" detectSteps=false' + +1. Make an API call. + +[comment]: # 'step httpRequest.url="https://example.com/api" httpRequest.method="GET"' + +2. Another call. + +[comment]: # 'step httpRequest.url="https://example.com/submit" httpRequest.method="POST" httpRequest.request.body="test"' +[comment]: # 'test end' +`; + +describe("CommonMark Comment Syntax with YAML Tests", function () { + it("should correctly parse parentheses syntax with YAML content: [comment]: # (test key: value)", async function () { + const tempFile = "temp_paren_yaml.md"; + fs.writeFileSync(tempFile, markdownParenthesesYaml.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("parentheses-yaml-test"); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(3); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("type").that.equals("hello world"); + expect(steps[2]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly parse single quote syntax with YAML content: [comment]: # 'test key: value'", async function () { + const tempFile = "temp_single_yaml.md"; + fs.writeFileSync(tempFile, markdownSingleQuoteYaml.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("single-quote-yaml-test"); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(3); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("type").that.equals("hello world"); + expect(steps[2]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly parse double quote syntax with YAML content: [comment]: # \"test key: value\"", async function () { + const tempFile = "temp_double_yaml.md"; + fs.writeFileSync(tempFile, markdownDoubleQuoteYaml.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("double-quote-yaml-test"); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(3); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("type").that.equals("hello world"); + expect(steps[2]).to.have.property("find").that.equals("HELLO WORLD"); + }); +}); + +describe("CommonMark Comment Syntax with XML Attribute Tests", function () { + it("should correctly parse parentheses syntax with XML attributes: [comment]: # (test key=\"value\")", async function () { + const tempFile = "temp_paren_xml.md"; + fs.writeFileSync(tempFile, markdownParenthesesXml.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("parentheses-xml-test"); + expect(results.specs[0].tests[0].detectSteps).to.equal(false); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(4); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("type").that.equals("hello world"); + expect(steps[2]).to.have.property("wait").that.equals(500); + expect(steps[3]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly parse single quote syntax with XML attributes: [comment]: # 'test key=\"value\"'", async function () { + const tempFile = "temp_single_xml.md"; + fs.writeFileSync(tempFile, markdownSingleQuoteXml.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("single-quote-xml-test"); + expect(results.specs[0].tests[0].detectSteps).to.equal(false); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(4); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("type").that.equals("hello world"); + expect(steps[2]).to.have.property("wait").that.equals(500); + expect(steps[3]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly parse double quote syntax with XML attributes using single quotes inside: [comment]: # \"test key='value'\"", async function () { + const tempFile = "temp_double_xml.md"; + fs.writeFileSync(tempFile, markdownDoubleQuoteXml.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("double-quote-xml-test"); + expect(results.specs[0].tests[0].detectSteps).to.equal(false); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(4); + expect(steps[0]).to.have.property("goTo").that.equals("http://localhost:3000"); + expect(steps[1]).to.have.property("type").that.equals("hello world"); + expect(steps[2]).to.have.property("wait").that.equals(500); + expect(steps[3]).to.have.property("find").that.equals("HELLO WORLD"); + }); + + it("should correctly parse parentheses syntax with XML dot notation: [comment]: # (step key.nested=\"value\")", async function () { + const tempFile = "temp_paren_xml_dot.md"; + fs.writeFileSync(tempFile, markdownParenthesesXmlDotNotation.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("parentheses-xml-dot-test"); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(2); + + expect(steps[0]).to.have.property("httpRequest"); + expect(steps[0].httpRequest).to.have.property("url").that.equals("https://example.com/api"); + expect(steps[0].httpRequest).to.have.property("method").that.equals("GET"); + + expect(steps[1]).to.have.property("httpRequest"); + expect(steps[1].httpRequest).to.have.property("url").that.equals("https://example.com/submit"); + expect(steps[1].httpRequest).to.have.property("method").that.equals("POST"); + expect(steps[1].httpRequest).to.have.property("request"); + expect(steps[1].httpRequest.request).to.have.property("body").that.equals("test"); + }); + + it("should correctly parse single quote syntax with XML dot notation: [comment]: # 'step key.nested=\"value\"'", async function () { + const tempFile = "temp_single_xml_dot.md"; + fs.writeFileSync(tempFile, markdownSingleQuoteXmlDotNotation.trim()); + const config = { input: tempFile }; + const results = await detectAndResolveTests({ config }); + fs.unlinkSync(tempFile); + + expect(results.specs).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests).to.be.an("array").that.has.lengthOf(1); + expect(results.specs[0].tests[0].testId).to.equal("single-quote-xml-dot-test"); + + const steps = results.specs[0].tests[0].contexts[0].steps; + expect(steps).to.be.an("array").that.has.lengthOf(2); + + expect(steps[0]).to.have.property("httpRequest"); + expect(steps[0].httpRequest).to.have.property("url").that.equals("https://example.com/api"); + expect(steps[0].httpRequest).to.have.property("method").that.equals("GET"); + + expect(steps[1]).to.have.property("httpRequest"); + expect(steps[1].httpRequest).to.have.property("url").that.equals("https://example.com/submit"); + expect(steps[1].httpRequest).to.have.property("method").that.equals("POST"); + expect(steps[1].httpRequest.request).to.have.property("body").that.equals("test"); + }); +}); + diff --git a/src/utils.js b/src/utils.js index 955b232..481d609 100644 --- a/src/utils.js +++ b/src/utils.js @@ -130,11 +130,35 @@ function parseObject({ stringifiedObject }) { return xmlAttrs; } - // If string, try to parse as JSON or YAML + // Try to parse as JSON first (handles valid JSON including those with escaped quotes in string values) try { const json = JSON.parse(stringifiedObject); return json; } catch (jsonError) { + // JSON parsing failed - check if this looks like escaped/double-encoded JSON + const trimmedString = stringifiedObject.trim(); + const looksLikeEscapedJson = + (trimmedString.startsWith("{") || trimmedString.startsWith("[")) && + trimmedString.includes('\\"'); + + if (looksLikeEscapedJson) { + let stringToParse; + try { + // Attempt to parse as double-encoded JSON + stringToParse = JSON.parse('"' + stringifiedObject + '"'); + } catch { + // Fallback to simple quote replacement for basic cases + stringToParse = stringifiedObject.replace(/\\"/g, '"'); + } + try { + const json = JSON.parse(stringToParse); + return json; + } catch { + // Fall through to YAML parsing + } + } + + // Try YAML as final fallback try { const yaml = YAML.parse(stringifiedObject); return yaml; @@ -598,8 +622,14 @@ async function parseContent({ config, content, filePath, fileType }) { // If the testId doesn't exist, set it test.testId = `${testId}`; } + // Normalize detectSteps field + if (test.detectSteps === "false") { + test.detectSteps = false; + } else if (test.detectSteps === "true") { + test.detectSteps = true; + } + // If the test doesn't have steps, add an empty array if (!test.steps) { - // If the test doesn't have steps, add an empty array test.steps = []; } tests.push(test); From 4e3734867305b158784d8bbfdb225c46adf42b94 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 4 Dec 2025 17:16:01 -0800 Subject: [PATCH 03/90] Squashed 'vscode/' changes from ce838992..23b4b759 23b4b759 bump version to match doc-detective-resolver d0d9c532 chore: bump doc-detective-resolver version to 3.6.1 git-subtree-dir: vscode git-subtree-split: 23b4b759519429dcc5561d0504f1dcc470f6b227 --- package-lock.json | 28 ++++++++++++++-------------- package.json | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b774ef..efe3956 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "doc-detective", - "version": "3.6.0", + "version": "3.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective", - "version": "3.6.0", + "version": "3.6.1", "license": "AGPL-3.0-only", "dependencies": { "@vscode/vsce": "^3.4.2", - "doc-detective-resolver": "^3.6.0", + "doc-detective-resolver": "^3.6.1", "js-yaml": "^4.1.0" }, "devDependencies": { @@ -716,9 +716,9 @@ } }, "node_modules/@posthog/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.6.0.tgz", - "integrity": "sha512-Tbh8UACwbb7jFdDC7wwXHtfNzO+4wKh3VbyMHmp2UBe6w1jliJixexTJNfkqdGZm+ht3M10mcKvGGPnoZ2zLBg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.0.tgz", + "integrity": "sha512-d6ZV4grpzeH/6/LP8quMVpSjY1puRkrqfwcPvGRKUAX7tb7YHyp/zMiTDuJmOFbpUxAMBXH5nDwcPiyCY2WGzA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.6" @@ -3096,9 +3096,9 @@ "license": "MIT" }, "node_modules/doc-detective-resolver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.6.0.tgz", - "integrity": "sha512-PzryeAbzU76s4iRaFVCTbdMyRyecs1bb+zN/XfE60B6oYNxcFWgGA1T+MmXM9fS47ITv5I0zOatLnvHEpJph+Q==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.6.1.tgz", + "integrity": "sha512-8loBGZctT4JWo5PgjYk9b4ZRyJy/Od33KKd5Q+Sa/XEiaQ0e6602e9oI/JDfmnaB1KGUi9qTigezRLIMQlH+Dw==", "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", @@ -3107,7 +3107,7 @@ "doc-detective-common": "^3.6.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.15.0" + "posthog-node": "^5.17.0" } }, "node_modules/doc-detective-resolver/node_modules/ajv": { @@ -5986,12 +5986,12 @@ } }, "node_modules/posthog-node": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.15.0.tgz", - "integrity": "sha512-Q70DGmUoy/Lavrq+qn2shIj/EQSeyaz6huIZQlLE6y8Xa6xtZw+Jg1lyr2nC1sEEFPCU1X7zkNvP6mjbYwqjYA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.0.tgz", + "integrity": "sha512-M+ftj0kLJk6wVF1xW5cStSany0LBC6YDVO7RPma2poo+PrpeiTk+ovhqcIqWAySDdTcBHJfBV9aIFYWPl2y6kg==", "license": "MIT", "dependencies": { - "@posthog/core": "1.6.0" + "@posthog/core": "1.7.0" }, "engines": { "node": ">=20" diff --git a/package.json b/package.json index 2567aa2..41e5f9b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Doc Detective", "publisher": "DocDetective", "description": "View Doc Detective tests for active files.", - "version": "3.6.0", + "version": "3.6.1", "sponsor": { "url": "https://github.com/sponsors/doc-detective" }, @@ -90,7 +90,7 @@ }, "dependencies": { "@vscode/vsce": "^3.4.2", - "doc-detective-resolver": "^3.6.0", + "doc-detective-resolver": "^3.6.1", "js-yaml": "^4.1.0" } } From e04dd513d189f80da1992054d9a76e528ea7c7b4 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 4 Dec 2025 17:16:55 -0800 Subject: [PATCH 04/90] Squashed 'cli/' changes from 7a82ced6..9e985467 9e985467 Dynamically size the spec list c01d9209 Add SpecSelector component and enhance TestBuilder with YAML support and spec detection e2877ba3 Enhance escape key handling in StepEditor, TestBuilder, and TestEditor for improved navigation and cancellation 3cde4bab Make lists scrollable 6699d071 Set specId 2c6f1056 Change terminal spacing behavior 750b5bda Change editor invokation d3b47474 Initial editor 96a7564f Add Ink-based CLI UI e72db834 update doc-detective-core [skip ci] b1f7d41a Auto dev release: v3.5.0-dev.1 [skip ci] 2f0d9691 fix: Respect false config values for recursive and detectSteps options (#160) 66b4718a update doc-detective-core [skip ci] ca5bf89f Drop Node 18 [skip ci] e37aaf66 Switch npm ci to npm i [skip ci] 0d8dd8be Auto dev release: v3.4.1-dev.1 [skip ci] 81d4b489 Remove integration example 52e22a88 update doc-detective-core [skip ci] c7749882 Fix core repo name [skip ci] 4b5e802e Auto dev release: v3.4.0-dev.10 [skip ci] 48a90d7e Fix patch versioning 03d05271 Auto dev release: v3.4.0-dev.9 [skip ci] 3ac6163d Fixed API reporter 1cbd321a Auto dev release: v3.4.0-dev.8 [skip ci] e9b4ebd0 dep updates 6a67254b Auto dev release: v3.4.0-dev.7 [skip ci] e65eedf3 Update deps dee756d4 Fixed context result field 3c3c760d Auto dev release: v3.4.0-dev.6 [skip ci] 4c47721f dev dep 8bd4305b Fix resolved-tests path 3ab1b529 Auto dev release: v3.4.0-dev.5 [skip ci] b98a5ca3 Update core version 45edccaa Auto dev release: v3.4.0-dev.4 [skip ci] 834c8c7d dev deps b3715bef Auto dev release: v3.4.0-dev.3 [skip ci] 23f2f715 Add support for fetching resolved tests via DOC_DETECTIVE_API environment variable (#158) b9b16490 Auto dev release: v3.4.0-dev.2 [skip ci] 5cb04ed3 Add support for DOC_DETECTIVE_CONFIG environment variable (#157) 5636f05b update doc-detective-core [skip ci] f1069eb3 Auto dev release: v3.4.0-dev.1 [skip ci] 18a78df6 Updated deps 39578230 update doc-detective-core [skip ci] e25eee03 update doc-detective-core [skip ci] 8fdbd6f4 Set version [skip ci] 446bf910 Auto dev release: v3.1.3-dev.2 [skip ci] 128bee14 Update package dependencies git-subtree-dir: cli git-subtree-split: 9e9854678a75b42b6003837f3ec8f4f6ee58c112 --- .github/workflows/auto-dev-release.yml | 2 +- .github/workflows/npm-test.yaml | 5 +- .github/workflows/update-core.yaml | 2 +- dev/dev.config.json | 4 + dev/dev.spec.json | 34 +- package-lock.json | 20987 ++++++++++++++--------- package.json | 18 +- samples/http.spec.yaml | 74 +- samples/kitten-search.spec.json | 43 +- samples/tests.spec.json | 70 - scripts/bump-sync-version-core.js | 40 +- src/cli/App.js | 49 + src/cli/ResultsSummary.js | 182 + src/cli/TestRunner.js | 54 + src/cli/builder/FieldEditor.mjs | 413 + src/cli/builder/SpecSelector.mjs | 208 + src/cli/builder/StepEditor.mjs | 639 + src/cli/builder/TestBuilder.mjs | 685 + src/cli/builder/TestEditor.mjs | 392 + src/cli/builder/builderRunner.js | 82 + src/cli/builder/components.mjs | 418 + src/cli/builder/index.js | 11 + src/cli/builder/schemaUtils.mjs | 526 + src/cli/runner.js | 96 + src/index.js | 143 +- src/utils.js | 210 +- test/resolvedTests.test.js | 193 + test/server/index.js | 48 +- test/utils.test.js | 427 +- 29 files changed, 17432 insertions(+), 8623 deletions(-) create mode 100644 dev/dev.config.json delete mode 100644 samples/tests.spec.json create mode 100644 src/cli/App.js create mode 100644 src/cli/ResultsSummary.js create mode 100644 src/cli/TestRunner.js create mode 100644 src/cli/builder/FieldEditor.mjs create mode 100644 src/cli/builder/SpecSelector.mjs create mode 100644 src/cli/builder/StepEditor.mjs create mode 100644 src/cli/builder/TestBuilder.mjs create mode 100644 src/cli/builder/TestEditor.mjs create mode 100644 src/cli/builder/builderRunner.js create mode 100644 src/cli/builder/components.mjs create mode 100644 src/cli/builder/index.js create mode 100644 src/cli/builder/schemaUtils.mjs create mode 100644 src/cli/runner.js create mode 100644 test/resolvedTests.test.js diff --git a/.github/workflows/auto-dev-release.yml b/.github/workflows/auto-dev-release.yml index f3e33f0..c7a4c07 100644 --- a/.github/workflows/auto-dev-release.yml +++ b/.github/workflows/auto-dev-release.yml @@ -90,7 +90,7 @@ jobs: - name: Install dependencies if: steps.check_changes.outputs.skip_release == 'false' - run: npm ci + run: npm install - name: Run tests if: steps.check_changes.outputs.skip_release == 'false' diff --git a/.github/workflows/npm-test.yaml b/.github/workflows/npm-test.yaml index 0e8341b..3afe1e3 100644 --- a/.github/workflows/npm-test.yaml +++ b/.github/workflows/npm-test.yaml @@ -28,7 +28,6 @@ jobs: - windows-latest - macos-latest node: - - 18 - 20 - 22 - 24 @@ -41,7 +40,7 @@ jobs: cache: 'npm' cache-dependency-path: package-lock.json - - run: npm ci + - run: npm install - run: npm test publish-npm: @@ -58,7 +57,7 @@ jobs: cache-dependency-path: package-lock.json registry-url: https://registry.npmjs.org/ - - run: npm ci + - run: npm install - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.github/workflows/update-core.yaml b/.github/workflows/update-core.yaml index 8eea5cb..0089ea1 100644 --- a/.github/workflows/update-core.yaml +++ b/.github/workflows/update-core.yaml @@ -105,7 +105,7 @@ jobs: # Remove ^ or ~ if present CORE_VERSION_CLEAN=$(echo "$CORE_VERSION" | sed 's/^[^0-9]*//') # Query GitHub API for release notes - RELEASE_INFO=$(gh release view "v$CORE_VERSION_CLEAN" --repo doc-detective/doc-detective-core --json body --jq .body || echo "No release notes found.") + RELEASE_INFO=$(gh release view "v$CORE_VERSION_CLEAN" --repo doc-detective/core --json body --jq .body || echo "No release notes found.") echo "release_notes<> $GITHUB_OUTPUT echo "$RELEASE_INFO" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT diff --git a/dev/dev.config.json b/dev/dev.config.json new file mode 100644 index 0000000..cba2af9 --- /dev/null +++ b/dev/dev.config.json @@ -0,0 +1,4 @@ +{ + "input": "dev.spec.json", + "logLevel": "debug" +} \ No newline at end of file diff --git a/dev/dev.spec.json b/dev/dev.spec.json index 595514b..ac6a528 100644 --- a/dev/dev.spec.json +++ b/dev/dev.spec.json @@ -1,45 +1,19 @@ { - "id": "Do all the things! - Spec", "tests": [ { - "id": "Do all the things! - Test", - "description": "This test includes nearly every property across all actions.", "steps": [ - { - "action": "setVariables", - "path": ".env" - }, { "action": "runShell", - "command": "echo", - "args": ["$USER"] + "command": "echo Hello, World!" }, { "action": "checkLink", "url": "https://www.duckduckgo.com" }, - { - "action": "httpRequest", - "url": "https://reqres.in/api/users", - "method": "post", - "requestData": { - "name": "morpheus", - "job": "leader" - }, - "responseData": { - "name": "morpheus", - "job": "leader" - }, - "statusCodes": [200, 201] - }, { "action": "goTo", "url": "https://www.google.com" }, - { - "action": "startRecording", - "path": "test.mp4" - }, { "action": "find", "selector": "[title=Search]", @@ -49,12 +23,6 @@ "typeKeys": { "keys": ["shorthair cat", "$ENTER$"] } - }, - { - "action": "wait" - }, - { - "action": "stopRecording" } ] } diff --git a/package-lock.json b/package-lock.json index 30ae800..c107a6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,426 +1,361 @@ { "name": "doc-detective", - "version": "3.1.3-dev.1", + "version": "3.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective", - "version": "3.1.3-dev.1", + "version": "3.5.1", "license": "AGPL-3.0-only", "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", - "doc-detective-common": "^3.1.1", - "doc-detective-core": "^3.1.3-dev.1", + "axios": "^1.13.2", + "doc-detective-common": "^3.5.1", + "doc-detective-core": "^3.5.1", + "ink": "^6.5.1", + "ink-select-input": "^6.2.0", + "ink-spinner": "^5.0.0", + "js-yaml": "^4.1.1", + "react": "^19.2.0", "yargs": "^17.7.2" }, "bin": { "doc-detective": "src/index.js" }, "devDependencies": { - "body-parser": "^2.2.0", - "chai": "^5.2.1", + "body-parser": "^2.2.1", + "chai": "^6.2.1", "express": "^5.1.0", - "mocha": "^11.7.1" + "mocha": "^11.7.5" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.1.1.tgz", - "integrity": "sha512-uGF1YGOzzD50L7HLNWclXmsEhQflw8/zZHIz0/AzkJrKL5r9PceUipZxR/cp/8veTk4TVfdDJLyIwXLjaP5ePg==", + "node_modules/@alcalzone/ansi-tokenize": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.2.tgz", + "integrity": "sha512-mkOh+Wwawzuf5wa30bvc4nA+Qb6DIrGWgBhRR/Pw4T9nsgYait8izvXkNyU78D6Wcu3Z+KUdwCmLCxlWjEotYA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@alcalzone/ansi-tokenize/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@alcalzone/ansi-tokenize/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" + "get-east-asian-width": "^1.3.1" }, "engines": { - "node": ">= 20" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/philsturgeon" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.2.tgz", + "integrity": "sha512-54vnqDyGsDAVM0LOIdGMnfVyCN1NlqoGnHEGpMfaDBLMvClfT4j2XbJgvfuF0Ca0kxT6Gb7xUgS5W1I14QqjiQ==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.1" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@types/json-schema": "^7.0.15" } }, "node_modules/@appium/base-driver": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.18.0.tgz", - "integrity": "sha512-rFSrxQ+honhQtWpveXIBuIjW+vfBoZWxG8i8vwS+TsDtsj2guE/1HAZ0qVc48CgTbn45sHzK7NtinX8Z2J/Wig==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", + "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", "dependencies": { - "@appium/support": "^6.1.1", - "@appium/types": "^0.26.0", + "@appium/support": "^7.0.3", + "@appium/types": "^1.1.1", "@colors/colors": "1.6.0", "async-lock": "1.4.1", "asyncbox": "3.0.0", - "axios": "1.9.0", + "axios": "1.13.2", "bluebird": "3.7.2", - "body-parser": "1.20.3", - "express": "4.21.2", + "body-parser": "2.2.0", + "express": "5.1.0", "fastest-levenshtein": "1.0.16", "http-status-codes": "2.3.0", "lodash": "4.17.21", - "lru-cache": "10.4.3", + "lru-cache": "11.2.2", "method-override": "3.0.0", - "morgan": "1.10.0", - "path-to-regexp": "8.2.0", - "serve-favicon": "2.5.0", + "morgan": "1.10.1", + "path-to-regexp": "8.3.0", + "serve-favicon": "2.5.1", "source-map-support": "0.5.21", - "type-fest": "4.41.0", - "validate.js": "0.13.1" + "type-fest": "5.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" }, "optionalDependencies": { "spdy": "4.0.2" } }, - "node_modules/@appium/base-driver/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@appium/base-driver/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/@appium/base-driver/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, + "node_modules/@appium/base-driver/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "20 || >=22" } }, - "node_modules/@appium/base-driver/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", + "node_modules/@appium/base-plugin": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", + "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", + "license": "Apache-2.0", "dependencies": { - "safe-buffer": "5.2.1" + "@appium/base-driver": "^10.1.1", + "@appium/support": "^7.0.3" }, "engines": { - "node": ">= 0.6" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, - "node_modules/@appium/base-driver/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/@appium/base-driver/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", + "node_modules/@appium/docutils": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", + "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", + "license": "Apache-2.0", "dependencies": { - "ms": "2.0.0" + "@appium/support": "^7.0.3", + "chalk": "4.1.2", + "consola": "3.4.2", + "diff": "8.0.2", + "lilconfig": "3.1.3", + "lodash": "4.17.21", + "pkg-dir": "5.0.0", + "read-pkg": "5.2.0", + "source-map-support": "0.5.21", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "yaml": "2.8.1", + "yargs": "18.0.0", + "yargs-parser": "22.0.0" + }, + "bin": { + "appium-docs": "bin/appium-docs.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, - "node_modules/@appium/base-driver/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/@appium/base-driver/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "node_modules/@appium/docutils/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.10.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@appium/base-driver/node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/@appium/base-driver/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", + "node_modules/@appium/docutils/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=20" } }, - "node_modules/@appium/base-driver/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, + "node_modules/@appium/docutils/node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@appium/base-driver/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.3.1" } }, - "node_modules/@appium/base-driver/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "node_modules/@appium/docutils/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" }, - "node_modules/@appium/base-driver/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/@appium/docutils/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@appium/base-driver/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "node": ">=18" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@appium/base-driver/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@appium/base-driver/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/@appium/docutils/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@appium/base-plugin": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.3.7.tgz", - "integrity": "sha512-VukauTOq8eHsJPx6rfeG/cXFDZPoF9PEI7bb72K9LBFc21Yy6iajzZRgJFF5Mga6+/GgISwGLo9gTOyk0bmhew==", - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^9.18.0", - "@appium/support": "^6.1.1" + "node": ">=18" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@appium/docutils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.1.1.tgz", - "integrity": "sha512-n00sqMJ25Wm08Aniu2kbA+2y5uVbehP9qZgYMy2uu/nDWxNR4HggB8vKhgL7fONd2vYbx5G/Ur/yCn2C0nsxLg==", - "license": "Apache-2.0", + "node_modules/@appium/docutils/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "license": "MIT", "dependencies": { - "@appium/support": "^6.1.1", - "@appium/tsconfig": "^0.3.5", - "@sliphua/lilconfig-ts-loader": "3.2.2", - "chalk": "4.1.2", - "consola": "3.4.2", - "diff": "8.0.2", - "json5": "2.2.3", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "pkg-dir": "5.0.0", - "read-pkg": "5.2.0", - "semver": "7.7.2", - "source-map-support": "0.5.21", - "teen_process": "2.3.2", - "type-fest": "4.41.0", - "typescript": "5.8.3", - "yaml": "2.8.0", - "yargs": "17.7.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "appium-docs": "bin/appium-docs.js" + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/@appium/docutils/node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "license": "BSD-3-Clause", + "node_modules/@appium/docutils/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", "engines": { - "node": ">=0.3.1" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/@appium/logger": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-1.7.1.tgz", - "integrity": "sha512-9C2o9X/lBEDBUnKfAi3mRo9oG7Z03nmISLwsGkWxIWjMAvBdJD0RRSJMekWVKzfXN3byrI1WlCXTITzN4LAoLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", + "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", "license": "ISC", "dependencies": { "console-control-strings": "1.1.0", "lodash": "4.17.21", - "lru-cache": "10.4.3", + "lru-cache": "11.2.2", "set-blocking": "2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/@appium/logger/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", + "engines": { + "node": "20 || >=22" } }, "node_modules/@appium/schema": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.8.1.tgz", - "integrity": "sha512-3yzfQ/K7RMGnfYDgFG7JdCPsjjN3eS33n2SBeGJtd28mDtgO7EzcmtiUBQjbkxyu0Q7h8KOexiqndvgTCgHeGQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", + "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/@appium/support": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-6.1.1.tgz", - "integrity": "sha512-kdv6zOCvVT93OeokEFqFN77yhgM8+u9qM7LMLooYd10/AOvI4jtrEy5B37FiaZYP3ONvvz8ohisU8/RA5FzDVQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", + "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^1.7.1", - "@appium/tsconfig": "^0.3.5", - "@appium/types": "^0.26.0", + "@appium/logger": "^2.0.2", + "@appium/tsconfig": "^1.1.0", + "@appium/types": "^1.1.1", "@colors/colors": "1.6.0", "archiver": "7.0.1", - "axios": "1.9.0", + "axios": "1.13.2", "base64-stream": "1.0.0", "bluebird": "3.7.2", "bplist-creator": "0.1.1", "bplist-parser": "0.3.2", - "form-data": "4.0.2", + "form-data": "4.0.4", "get-stream": "6.0.1", - "glob": "10.4.5", + "glob": "11.0.3", "jsftp": "2.1.3", "klaw": "4.1.0", "lockfile": "1.0.4", "lodash": "4.17.21", "log-symbols": "4.1.0", "moment": "2.30.1", - "mv": "2.1.1", "ncp": "2.0.0", "pkg-dir": "5.0.0", "plist": "3.1.0", @@ -428,77 +363,155 @@ "read-pkg": "5.2.0", "resolve-from": "5.0.0", "sanitize-filename": "1.6.3", - "semver": "7.7.2", - "shell-quote": "1.8.2", + "semver": "7.7.3", + "shell-quote": "1.8.3", "source-map-support": "0.5.21", "supports-color": "8.1.1", - "teen_process": "2.3.2", - "type-fest": "4.41.0", - "uuid": "11.1.0", - "which": "4.0.0", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "uuid": "13.0.0", + "which": "5.0.0", "yauzl": "3.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" }, "optionalDependencies": { - "sharp": "0.34.2" + "sharp": "0.34.5" } }, - "node_modules/@appium/tsconfig": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.5.tgz", - "integrity": "sha512-T8G5oe3is0Gn56PkeYjXracc0CS26L/obVuX7PHwEDcn1UKiJXFa2MYY73dRAWKJumAIIsJjssNUu6VttdWZWw==", - "license": "Apache-2.0", + "node_modules/@appium/support/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "license": "ISC", "dependencies": { - "@tsconfig/node14": "14.1.3" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@appium/types": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.26.0.tgz", - "integrity": "sha512-EO7r3H9cd1WePt/Gtb+TKBeWulSKjtNHAxD0llqqQ5hFwfNHWcmdObHL/d8jkyG53E/f54VeBcjD+uCARRqDqw==", - "license": "Apache-2.0", + "node_modules/@appium/support/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "@appium/logger": "^1.7.1", - "@appium/schema": "^0.8.1", - "@appium/tsconfig": "^0.3.5", - "type-fest": "4.41.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", + "node_modules/@appium/support/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@appium/support/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", + "node_modules/@appium/support/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, "engines": { - "node": ">=6.9.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@colors/colors": { + "node_modules/@appium/tsconfig": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", + "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", + "license": "Apache-2.0", + "dependencies": { + "@tsconfig/node20": "20.1.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/@appium/types": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", + "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", + "license": "Apache-2.0", + "dependencies": { + "@appium/logger": "^2.0.2", + "@appium/schema": "^1.0.0", + "@appium/tsconfig": "^1.1.0", + "type-fest": "5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", @@ -508,20 +521,20 @@ } }, "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", "dependencies": { - "colorspace": "1.1.x", + "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "license": "MIT", "optional": true, "dependencies": { @@ -652,10 +665,20 @@ "win32" ] }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "cpu": [ "arm64" ], @@ -671,13 +694,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "cpu": [ "x64" ], @@ -693,29 +716,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "cpu": [ "arm64" ], @@ -729,9 +736,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.6.tgz", - "integrity": "sha512-Rr8nr7B8fExy1Mk2NXYoQvl2YWplVMfCxRpi0ZxBmd/sIsUYAFSvOY708QV/KKGi/vxgKjy4VN6Xi3i8w6T2Yw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], @@ -745,9 +752,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], @@ -761,9 +768,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], @@ -777,9 +784,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.0.4.tgz", - "integrity": "sha512-7JqSzPHmS6O1hBzv9xNpww+a/UWsZKAh4PEdVmZyaYgVigo7TMbrmdhKYr8y6E3ToKCTb0RzU0LqqiowgmLRIg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", "cpu": [ "ppc64" ], @@ -792,10 +799,26 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.6.tgz", - "integrity": "sha512-TI9q0TqPskSaD0rpUFaMgwG9o6WGRD2VGOltYNPYTwGXU+fnpKpzUb7A9kp+8RF6zobY7TVkc5xUQC8h/4apaA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "cpu": [ "s390x" ], @@ -809,9 +832,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -825,9 +848,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], @@ -841,9 +864,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ "x64" ], @@ -857,9 +880,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ "arm" ], @@ -875,13 +898,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" + "@img/sharp-libvips-linux-arm": "1.2.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "cpu": [ "arm64" ], @@ -897,13 +920,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" + "@img/sharp-libvips-linux-arm64": "1.2.4" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", - "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", "cpu": [ "ppc64" ], @@ -919,29 +942,35 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.0" + "@img/sharp-libvips-linux-ppc64": "1.2.4" } }, - "node_modules/@img/sharp-linux-ppc64/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", "cpu": [ - "ppc64" + "riscv64" ], - "license": "LGPL-3.0-or-later", + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "cpu": [ "s390x" ], @@ -957,29 +986,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-s390x/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], @@ -995,13 +1008,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "cpu": [ "arm64" ], @@ -1017,13 +1030,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "cpu": [ "x64" ], @@ -1039,20 +1052,20 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "cpu": [ "wasm32" ], "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.2.0" + "@emnapi/runtime": "^1.7.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -1062,9 +1075,9 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", - "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", "cpu": [ "arm64" ], @@ -1081,9 +1094,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "cpu": [ "ia32" ], @@ -1100,9 +1113,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], @@ -1118,6 +1131,27 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1194,6 +1228,15 @@ "node": ">=14" } }, + "node_modules/@posthog/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.6.0.tgz", + "integrity": "sha512-Tbh8UACwbb7jFdDC7wwXHtfNzO+4wKh3VbyMHmp2UBe6w1jliJixexTJNfkqdGZm+ht3M10mcKvGGPnoZ2zLBg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6" + } + }, "node_modules/@promptbook/utils": { "version": "0.69.5", "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz", @@ -1214,17 +1257,17 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz", - "integrity": "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==", + "version": "2.10.13", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", + "integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", - "semver": "^7.7.2", - "tar-fs": "^3.1.0", + "semver": "^7.7.3", + "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "bin": { @@ -1235,60 +1278,28 @@ } }, "node_modules/@sidvind/better-ajv-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-3.0.1.tgz", - "integrity": "sha512-++1mEYIeozfnwWI9P1ECvOPoacy+CgDASrmGvXPMCcqgx0YUzB01vZ78uHdQ443V6sTY+e9MzHqmN9DOls02aw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", + "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", "dependencies": { "kleur": "^4.1.0" }, "engines": { - "node": ">= 16.14" - }, - "peerDependencies": { - "ajv": "^6.12.3 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sliphua/lilconfig-ts-loader": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sliphua/lilconfig-ts-loader/-/lilconfig-ts-loader-3.2.2.tgz", - "integrity": "sha512-nX2aBwAykiG50fSUzK9eyA5UvWcrEKzA0ZzCq9mLwHMwpKxM+U05YH8PHba1LJrbeZ7R1HSjJagWKMqFyq8cxw==", - "license": "MIT", - "dependencies": { - "lodash.get": "^4", - "make-error": "^1", - "ts-node": "^9", - "tslib": "^2" - }, - "engines": { - "node": ">=10.0.0" + "node": ">= 18" }, "peerDependencies": { - "lilconfig": ">=2" + "ajv": "^7.0.0 || ^8.0.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" + "color": "^5.0.2", + "text-hex": "1.0.x" } }, "node_modules/@tootallnate/quickjs-emscripten": { @@ -1297,31 +1308,26 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "license": "MIT" }, - "node_modules/@tsconfig/node14": { - "version": "14.1.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.3.tgz", - "integrity": "sha512-ZC9/Kq2c0+4l8sDx/z3YQyP7+OSMTQr/xxJaSFHLGhGL0t9bPjuX1Zwmg3C2VB5KWGgI8MXMRShXRJroy4utGA==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "node_modules/@tsconfig/node20": { + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", + "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/node": { - "version": "22.14.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", - "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/normalize-package-data": { @@ -1330,6 +1336,12 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "license": "MIT" }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "license": "MIT" + }, "node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", @@ -1362,42 +1374,42 @@ } }, "node_modules/@wdio/config": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.45.0.tgz", - "integrity": "sha512-rxnTEe7UKFSGMWMHaGUtrGoFOYqqw2t8UjtidDAyJVHUUkAhKGPbk88qpq6tON4mwaI1yuMiR41qci+ZaAmf4w==", + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.20.1.tgz", + "integrity": "sha512-npl2J+rjCDJPjVySgWpciOyhWddn6s7n5sepKXLR7x1ADQHl5zUFv1dHD3jx4OQ9l6lrGQSPaofuz+7e9mu+vg==", "license": "MIT", "dependencies": { - "@wdio/logger": "8.38.0", - "@wdio/types": "8.41.0", - "@wdio/utils": "8.45.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", + "@wdio/logger": "9.18.0", + "@wdio/types": "9.20.0", + "@wdio/utils": "9.20.1", + "deepmerge-ts": "^7.0.3", "glob": "^10.2.2", "import-meta-resolve": "^4.0.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, - "node_modules/@wdio/config/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "node_modules/@wdio/logger": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.18.0.tgz", + "integrity": "sha512-HdzDrRs+ywAqbXGKqe1i/bLtCv47plz4TvsHFH3j729OooT5VH38ctFn5aLXgECmiAKDkmH/A6kOq2Zh5DIxww==", "license": "MIT", "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", "loglevel-plugin-prefix": "^0.8.4", + "safe-regex2": "^5.0.0", "strip-ansi": "^7.1.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, - "node_modules/@wdio/config/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -1406,257 +1418,150 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@wdio/logger": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.4.4.tgz", - "integrity": "sha512-BXx8RXFUW2M4dcO6t5Le95Hi2ZkTQBRsvBQqLekT2rZ6Xmw8ZKZBPf0FptnoftFGg6dYmwnDidYv/0+4PiHjpQ==", + "node_modules/@wdio/protocols": { + "version": "9.16.2", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.16.2.tgz", + "integrity": "sha512-h3k97/lzmyw5MowqceAuY3HX/wGJojXHkiPXA3WlhGPCaa2h4+GovV2nJtRvknCKsE7UHA1xB5SWeI8MzloBew==", + "license": "MIT" + }, + "node_modules/@wdio/repl": { + "version": "9.16.2", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.16.2.tgz", + "integrity": "sha512-FLTF0VL6+o5BSTCO7yLSXocm3kUnu31zYwzdsz4n9s5YWt83sCtzGZlZpt7TaTzb3jVUfxuHNQDTb8UMkCu0lQ==", "license": "MIT", "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" + "@types/node": "^20.1.0" }, "engines": { "node": ">=18.20.0" } }, - "node_modules/@wdio/logger/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/@wdio/repl/node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "dependencies": { + "undici-types": "~6.21.0" } }, - "node_modules/@wdio/protocols": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.44.0.tgz", - "integrity": "sha512-Do+AW3xuDUHWkrX++LeMBSrX2yRILlDqunRHPMv4adGFEA45m7r4WP8wGCDb+chrHGhXq5TwB9Ne4J7x1dHGng==", + "node_modules/@wdio/repl/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, - "node_modules/@wdio/repl": { - "version": "8.40.3", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.40.3.tgz", - "integrity": "sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw==", + "node_modules/@wdio/types": { + "version": "9.20.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.20.0.tgz", + "integrity": "sha512-zMmAtse2UMCSOW76mvK3OejauAdcFGuKopNRH7crI0gwKTZtvV89yXWRziz9cVXpFgfmJCjf9edxKFWdhuF5yw==", "license": "MIT", "dependencies": { - "@types/node": "^22.2.0" + "@types/node": "^20.1.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, - "node_modules/@wdio/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.41.0.tgz", - "integrity": "sha512-t4NaNTvJZci3Xv/yUZPH4eTL0hxrVTf5wdwNnYIBrzMnlRDbNefjQ0P7FM7ZjQCLaH92AEH6t/XanUId7Webug==", + "node_modules/@wdio/types/node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", "dependencies": { - "@types/node": "^22.2.0" - }, - "engines": { - "node": "^16.13 || >=18" + "undici-types": "~6.21.0" } }, + "node_modules/@wdio/types/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/@wdio/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-jLJ8eafbo3VrKE3fxumcWh/oiYq77MR+JSyIarGipZpxxMYUWhleba/Pqphc1J8LkDg/WRRVUdvOManP6BLAoA==", + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.20.1.tgz", + "integrity": "sha512-C/Gsy5NAatsGUF1eT9Ks/ErR52/X4YI7MSm7BtwNOw8v2Ko+SiCA5qXts61J0A7QYwOn4gfXfBZZnzSAng6G/w==", "license": "MIT", "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.38.0", - "@wdio/types": "8.41.0", + "@puppeteer/browsers": "^2.2.0", + "@wdio/logger": "9.18.0", + "@wdio/types": "9.20.0", "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.5.0", - "geckodriver": "~4.2.0", + "deepmerge-ts": "^7.0.3", + "edgedriver": "^6.1.2", + "geckodriver": "^5.0.0", "get-port": "^7.0.0", "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", + "locate-app": "^2.2.24", + "mitt": "^3.0.1", + "safaridriver": "^1.0.0", "split2": "^4.2.0", - "wait-port": "^1.0.4" + "wait-port": "^1.1.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, - "node_modules/@wdio/utils/node_modules/@puppeteer/browsers": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", - "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", - "license": "Apache-2.0", + "node_modules/@wdio/utils/node_modules/geckodriver": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-5.0.0.tgz", + "integrity": "sha512-vn7TtQ3b9VMJtVXsyWtQQl1fyBVFhQy7UvJF96kPuuJ0or5THH496AD3eUyaDD11+EqCxH9t6V+EP9soZQk4YQ==", + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.1", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" + "@wdio/logger": "^9.1.3", + "@zip.js/zip.js": "^2.7.53", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.6", + "which": "^5.0.0" }, "bin": { - "browsers": "lib/cjs/main-cli.js" + "geckodriver": "bin/geckodriver.js" }, "engines": { - "node": ">=16.3.0" + "node": ">=18.0.0" } }, - "node_modules/@wdio/utils/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, "engines": { - "node": "^16.13 || >=18" + "node": ">=10.0.0" } }, - "node_modules/@wdio/utils/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", + "node_modules/@zip.js/zip.js": { + "version": "2.8.11", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.11.tgz", + "integrity": "sha512-0fztsk/0ryJ+2PPr9EyXS5/Co7OK8q3zY/xOoozEWaUsL5x+C0cyZ4YyMuUffOO2Dx/rAdq4JMPqW0VUtm+vzA==", + "license": "BSD-3-Clause", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=18.0.0" } }, - "node_modules/@wdio/utils/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@wdio/utils/node_modules/geckodriver": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.2.1.tgz", - "integrity": "sha512-4m/CRk0OI8MaANRuFIahvOxYTSjlNAO2p9JmE14zxueknq6cdtB5M9UGRQ8R9aMV0bLGNVHHDnDXmoXdOwJfWg==", - "hasInstallScript": true, - "license": "MPL-2.0", - "dependencies": { - "@wdio/logger": "^8.11.0", - "decamelize": "^6.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.1", - "tar-fs": "^3.0.4", - "unzipper": "^0.10.14", - "which": "^4.0.0" - }, - "bin": { - "geckodriver": "bin/geckodriver.js" - }, - "engines": { - "node": "^16.13 || >=18 || >=20" - } - }, - "node_modules/@wdio/utils/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/utils/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/@wdio/utils/node_modules/proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@wdio/utils/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "license": "MIT", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@zip.js/zip.js": { - "version": "2.7.60", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.60.tgz", - "integrity": "sha512-vA3rLyqdxBrVo1FWSsbyoecaqWTV+vgPRf0QKeM7kVDG0r+lHUqd7zQDv1TO9k4BcAoNzNDSNrrel24Mk6addA==", - "license": "BSD-3-Clause", - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=16.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" + "node": ">=6.5" } }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "dev": true, "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -1670,7 +1575,6 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -1680,7 +1584,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -1690,9 +1593,9 @@ } }, "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { "node": ">= 14" @@ -1749,6 +1652,21 @@ "ajv": "^8.8.2" } }, + "node_modules/ansi-escapes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -1775,160 +1693,203 @@ } }, "node_modules/appium": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/appium/-/appium-2.19.0.tgz", - "integrity": "sha512-Y77R0eG58/p6HJN5Qf4fDFI1Ra47HW6XdG+QB54L5KjTuG/fPPjXAi143CyyvEF4Hc5FdMILSAb+uSn8P6Ywpw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.1.tgz", + "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@appium/base-driver": "^9.18.0", - "@appium/base-plugin": "^2.3.7", - "@appium/docutils": "^1.1.1", - "@appium/logger": "^1.7.1", - "@appium/schema": "^0.8.1", - "@appium/support": "^6.1.1", - "@appium/types": "^0.26.0", - "@sidvind/better-ajv-errors": "3.0.1", + "@appium/base-driver": "^10.1.1", + "@appium/base-plugin": "^3.0.4", + "@appium/docutils": "^2.1.2", + "@appium/logger": "^2.0.2", + "@appium/schema": "^1.0.0", + "@appium/support": "^7.0.3", + "@appium/types": "^1.1.1", + "@sidvind/better-ajv-errors": "4.0.0", "ajv": "8.17.1", "ajv-formats": "3.0.1", "argparse": "2.0.1", "async-lock": "1.4.1", "asyncbox": "3.0.0", - "axios": "1.9.0", + "axios": "1.13.2", "bluebird": "3.7.2", "lilconfig": "3.1.3", "lodash": "4.17.21", - "lru-cache": "10.4.3", + "lru-cache": "11.2.2", "ora": "5.4.1", "package-changed": "3.0.0", "resolve-from": "5.0.0", - "semver": "7.7.2", + "semver": "7.7.3", "source-map-support": "0.5.21", - "teen_process": "2.3.2", - "type-fest": "4.41.0", - "winston": "3.17.0", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "winston": "3.18.3", "wrap-ansi": "7.0.0", - "ws": "8.18.2", - "yaml": "2.8.0" + "ws": "8.18.3", + "yaml": "2.8.1" }, "bin": { "appium": "index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-chromium-driver": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/appium-chromium-driver/-/appium-chromium-driver-1.5.1.tgz", - "integrity": "sha512-0g+UlVlm6cppuYISkPSrlGV287hiXAoFZUcLUPnhYo4YzwGMrTIOgR8VDck7ny/bNZ8wu8iGdZfUC2IgfolFmQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/appium-chromium-driver/-/appium-chromium-driver-2.0.3.tgz", + "integrity": "sha512-qT3ldg0EFW9yuU0E/11ME4e7BIx5A17Ti+zvv1JR9soflJd5ruCY+j+6IP18RCKwYgBk152ey85cD6JvotL0Jw==", "hasShrinkwrap": true, "license": "Apache-2.0", "dependencies": { - "appium-chromedriver": "^7.0.6", + "appium-chromedriver": "^8.0.0", "bluebird": "^3.7.2", "lodash": "^4.17.21" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" }, "peerDependencies": { - "appium": "^2.11.5" + "appium": "^3.0.0-rc.2" } }, "node_modules/appium-chromium-driver/node_modules/@appium/base-driver": { - "version": "9.16.2", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.16.2.tgz", - "integrity": "sha512-vuQf9XQKGAMl5d5pM63FOrnRJUSVjw6J5kPXApfnkTJovwyV9SViYptnCB/TcahjX2bHQ+fUka82MWzHKPzpHg==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", + "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", "dependencies": { - "@appium/support": "^6.0.6", - "@appium/types": "^0.25.1", + "@appium/support": "^7.0.3", + "@appium/types": "^1.1.1", "@colors/colors": "1.6.0", "async-lock": "1.4.1", "asyncbox": "3.0.0", - "axios": "1.7.9", + "axios": "1.13.2", "bluebird": "3.7.2", - "body-parser": "1.20.3", - "express": "4.21.2", + "body-parser": "2.2.0", + "express": "5.1.0", "fastest-levenshtein": "1.0.16", "http-status-codes": "2.3.0", "lodash": "4.17.21", - "lru-cache": "10.4.3", + "lru-cache": "11.2.2", "method-override": "3.0.0", - "morgan": "1.10.0", - "path-to-regexp": "8.2.0", - "serve-favicon": "2.5.0", + "morgan": "1.10.1", + "path-to-regexp": "8.3.0", + "serve-favicon": "2.5.1", "source-map-support": "0.5.21", - "type-fest": "4.35.0", - "validate.js": "0.13.1" + "type-fest": "5.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" }, "optionalDependencies": { "spdy": "4.0.2" } }, + "node_modules/appium-chromium-driver/node_modules/@appium/base-plugin": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", + "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@appium/base-driver": "^10.1.1", + "@appium/support": "^7.0.3" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/appium-chromium-driver/node_modules/@appium/docutils": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", + "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "@appium/support": "^7.0.3", + "chalk": "4.1.2", + "consola": "3.4.2", + "diff": "8.0.2", + "lilconfig": "3.1.3", + "lodash": "4.17.21", + "pkg-dir": "5.0.0", + "read-pkg": "5.2.0", + "source-map-support": "0.5.21", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "yaml": "2.8.1", + "yargs": "18.0.0", + "yargs-parser": "22.0.0" + }, + "bin": { + "appium-docs": "bin/appium-docs.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, "node_modules/appium-chromium-driver/node_modules/@appium/logger": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-1.6.1.tgz", - "integrity": "sha512-3TWpLR1qVQ0usLJ6R49iN4TV9Zs0nog1oL3hakCglwP0g4ZllwwEbp+2b1ovJfX6oOv1wXNREyokq2uxU5gB/Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", + "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", "license": "ISC", "dependencies": { "console-control-strings": "1.1.0", "lodash": "4.17.21", - "lru-cache": "10.4.3", + "lru-cache": "11.2.2", "set-blocking": "2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-chromium-driver/node_modules/@appium/schema": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.8.1.tgz", - "integrity": "sha512-3yzfQ/K7RMGnfYDgFG7JdCPsjjN3eS33n2SBeGJtd28mDtgO7EzcmtiUBQjbkxyu0Q7h8KOexiqndvgTCgHeGQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", + "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-chromium-driver/node_modules/@appium/support": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-6.0.6.tgz", - "integrity": "sha512-qgj1uxHF7Suqi8wdWFBrG12dhLMAthpX973L7JHutM2jneynoIUaKtSXdd6zg0ZG/9clfY0C/06pIQTQljj+Lg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", + "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^1.6.1", - "@appium/tsconfig": "^0.3.4", - "@appium/types": "^0.25.1", + "@appium/logger": "^2.0.2", + "@appium/tsconfig": "^1.1.0", + "@appium/types": "^1.1.1", "@colors/colors": "1.6.0", "archiver": "7.0.1", - "axios": "1.7.9", + "axios": "1.13.2", "base64-stream": "1.0.0", "bluebird": "3.7.2", "bplist-creator": "0.1.1", "bplist-parser": "0.3.2", - "form-data": "4.0.2", + "form-data": "4.0.4", "get-stream": "6.0.1", - "glob": "10.4.5", + "glob": "11.0.3", "jsftp": "2.1.3", "klaw": "4.1.0", "lockfile": "1.0.4", "lodash": "4.17.21", "log-symbols": "4.1.0", "moment": "2.30.1", - "mv": "2.1.1", "ncp": "2.0.0", "pkg-dir": "5.0.0", "plist": "3.1.0", @@ -1936,71 +1897,71 @@ "read-pkg": "5.2.0", "resolve-from": "5.0.0", "sanitize-filename": "1.6.3", - "semver": "7.7.1", - "shell-quote": "1.8.2", + "semver": "7.7.3", + "shell-quote": "1.8.3", "source-map-support": "0.5.21", "supports-color": "8.1.1", - "teen_process": "2.2.3", - "type-fest": "4.35.0", - "uuid": "11.1.0", - "which": "4.0.0", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "uuid": "13.0.0", + "which": "5.0.0", "yauzl": "3.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" }, "optionalDependencies": { - "sharp": "0.33.5" + "sharp": "0.34.5" } }, "node_modules/appium-chromium-driver/node_modules/@appium/tsconfig": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.4.tgz", - "integrity": "sha512-tX719/ekarAWmJb+AaG6//8+3qQITshTgTZor0EbdEwA2KG3bGPwMIoCp10np6/qFr+sMZC0CbuKJruHSCDhhw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", + "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", "license": "Apache-2.0", "dependencies": { - "@tsconfig/node14": "14.1.2" + "@tsconfig/node20": "20.1.6" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-chromium-driver/node_modules/@appium/types": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.25.1.tgz", - "integrity": "sha512-2Lu5qwFNQa+iPw98XdB5/7tXKO7dugZHXfAsF050wgJkJJ4kDemVFJ4yr1YqM7DYmgqZnt+k0EfzshLODCHXTA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", + "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^1.6.1", - "@appium/schema": "^0.8.1", - "@appium/tsconfig": "^0.3.4", - "type-fest": "4.35.0" + "@appium/logger": "^2.0.2", + "@appium/schema": "^1.0.0", + "@appium/tsconfig": "^1.1.0", + "type-fest": "5.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-chromium-driver/node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/appium-chromium-driver/node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2015,42 +1976,42 @@ "node": ">=0.1.90" } }, - "node_modules/appium-chromium-driver/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-chromium-driver/node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/appium-chromium-driver/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", + "node_modules/appium-chromium-driver/node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, "node_modules/appium-chromium-driver/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -2064,9 +2025,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], @@ -2082,7 +2043,28 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/appium-chromium-driver/node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/appium-chromium-driver/node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/appium-chromium-driver/node_modules/@isaacs/cliui": { @@ -2103,9 +2085,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -2141,10 +2123,37 @@ "node": ">=14" } }, - "node_modules/appium-chromium-driver/node_modules/@tsconfig/node14": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.2.tgz", - "integrity": "sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q==", + "node_modules/appium-chromium-driver/node_modules/@sidvind/better-ajv-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", + "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", + "extraneous": true, + "license": "Apache-2.0", + "dependencies": { + "kleur": "^4.1.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "ajv": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/appium-chromium-driver/node_modules/@tsconfig/node20": { + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", + "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/@types/normalize-package-data": { @@ -2153,13 +2162,20 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "license": "MIT" }, + "node_modules/appium-chromium-driver/node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/@xmldom/xmldom": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.7.tgz", - "integrity": "sha512-syvR8iIJjpTZ/stv7l89UAViwGFh6lbheeOaqSxkYx9YNmIVvPTRH+CT/fpykFtUx5N+8eSMDRvggF9J8GEPzQ==", + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", "engines": { - "node": ">=14.6" + "node": ">=10.0.0" } }, "node_modules/appium-chromium-driver/node_modules/abort-controller": { @@ -2175,22 +2191,40 @@ } }, "node_modules/appium-chromium-driver/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/appium-chromium-driver/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/appium-chromium-driver/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -2215,37 +2249,37 @@ } }, "node_modules/appium-chromium-driver/node_modules/appium-adb": { - "version": "12.12.1", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-12.12.1.tgz", - "integrity": "sha512-CgdvLBBtLkZeObJegsCQo2eUTzuHESkeewbfWROFNtrVmxKS30J9y9YV4h5WIYJbyhgQCJeX+yDa+1gO/ejFjA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.0.3.tgz", + "integrity": "sha512-fJIEikjVoKsj9PfM2iPBn4kEMHy78ZY6PBC4pTiSv0rlAgxnScQW9OLm2l4wEaE8ODwnY2zJZDHehEGZ2b79fg==", "license": "Apache-2.0", "dependencies": { - "@appium/support": "^6.0.0", + "@appium/support": "^7.0.0-rc.1", "async-lock": "^1.0.0", "asyncbox": "^3.0.0", "bluebird": "^3.4.7", - "ini": "^5.0.0", + "ini": "^6.0.0", "lodash": "^4.0.0", - "lru-cache": "^10.0.0", + "lru-cache": "^11.1.0", "semver": "^7.0.0", "source-map-support": "^0.x", - "teen_process": "^2.2.0" + "teen_process": "^3.0.0" }, "engines": { - "node": ">=14", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-chromium-driver/node_modules/appium-chromedriver": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-7.0.6.tgz", - "integrity": "sha512-+ycgTuznlRbnvRr8uJBG7adhBcG7sov9FYaPxdg119EGsazaIc2MT8d/2MPBOh8Y9ms8SOf8RL26kXMsImIEpA==", + "version": "8.0.21", + "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.21.tgz", + "integrity": "sha512-l5SUc+VAykdFvwWwA7C6Kg4SdH45d1N/lyGvj/60b8W3Fv/HhfLDM0b1yhjH+leO7bBjS80iQI+z+P+1Fk5ydw==", "license": "Apache-2.0", "dependencies": { - "@appium/base-driver": "^9.1.0", - "@appium/support": "^6.0.0", + "@appium/base-driver": "^10.0.0-rc.2", + "@appium/support": "^7.0.0-rc.1", "@xmldom/xmldom": "^0.x", - "appium-adb": "^12.0.0", + "appium-adb": "^14.0.0", "asyncbox": "^3.0.0", "axios": "^1.6.5", "bluebird": "^3.5.1", @@ -2253,12 +2287,12 @@ "lodash": "^4.17.4", "semver": "^7.0.0", "source-map-support": "^0.x", - "teen_process": "^2.2.0", + "teen_process": "^3.0.0", "xpath": "^0.x" }, "engines": { - "node": ">=14", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-chromium-driver/node_modules/archiver": { @@ -2297,25 +2331,93 @@ "node": ">= 14" } }, - "node_modules/appium-chromium-driver/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/appium-chromium-driver/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "extraneous": true, - "license": "Python-2.0" + "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/appium-chromium-driver/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" + "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/appium-chromium-driver/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "extraneous": true, + "license": "Python-2.0" }, "node_modules/appium-chromium-driver/node_modules/async": { "version": "3.2.6", @@ -2350,21 +2452,29 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "node_modules/appium-chromium-driver/node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/appium-chromium-driver/node_modules/balanced-match": { "version": "1.0.2", @@ -2373,11 +2483,18 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", - "optional": true + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/appium-chromium-driver/node_modules/base64-js": { "version": "1.5.1", @@ -2432,6 +2549,33 @@ "node": ">=0.6" } }, + "node_modules/appium-chromium-driver/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/appium-chromium-driver/node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -2439,44 +2583,25 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/appium-chromium-driver/node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node": ">=18" } }, - "node_modules/appium-chromium-driver/node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/appium-chromium-driver/node_modules/bplist-creator": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", @@ -2498,14 +2623,29 @@ "node": ">= 5.10.0" } }, - "node_modules/appium-chromium-driver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/appium-chromium-driver/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "extraneous": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "node_modules/appium-chromium-driver/node_modules/buffer-crc32": { @@ -2546,13 +2686,13 @@ } }, "node_modules/appium-chromium-driver/node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -2589,78 +2729,125 @@ "node": ">=8" } }, + "node_modules/appium-chromium-driver/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/appium-chromium-driver/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/appium-chromium-driver/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "extraneous": true, "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=20" } }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "extraneous": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "extraneous": true, "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "extraneous": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "extraneous": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/appium-chromium-driver/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=0.8" } }, "node_modules/appium-chromium-driver/node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "extraneous": true, "license": "MIT", - "optional": true, "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" }, "engines": { - "node": ">=12.5.0" + "node": ">=18" } }, "node_modules/appium-chromium-driver/node_modules/color-convert": { @@ -2682,32 +2869,77 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "extraneous": true, "license": "MIT", - "optional": true, "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/appium-chromium-driver/node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/appium-chromium-driver/node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "extraneous": true, "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, "engines": { - "node": ">= 0.8" + "node": ">=12.20" } }, - "node_modules/appium-chromium-driver/node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "node_modules/appium-chromium-driver/node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/appium-chromium-driver/node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/appium-chromium-driver/node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/appium-chromium-driver/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/appium-chromium-driver/node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/compress-commons": { @@ -2726,11 +2958,15 @@ "node": ">= 14" } }, - "node_modules/appium-chromium-driver/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "node_modules/appium-chromium-driver/node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/appium-chromium-driver/node_modules/console-control-strings": { "version": "1.1.0", @@ -2739,9 +2975,9 @@ "license": "ISC" }, "node_modules/appium-chromium-driver/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -2760,19 +2996,22 @@ } }, "node_modules/appium-chromium-driver/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/appium-chromium-driver/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/appium-chromium-driver/node_modules/core-util-is": { "version": "1.0.3", @@ -2805,13 +3044,6 @@ "node": ">= 14" } }, - "node_modules/appium-chromium-driver/node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "extraneous": true, - "license": "MIT" - }, "node_modules/appium-chromium-driver/node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2848,11 +3080,10 @@ } }, "node_modules/appium-chromium-driver/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "optional": true, "dependencies": { "ms": "^2.1.3" }, @@ -2865,6 +3096,19 @@ } } }, + "node_modules/appium-chromium-driver/node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/appium-chromium-driver/node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2883,20 +3127,10 @@ "node": ">= 0.8" } }, - "node_modules/appium-chromium-driver/node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/appium-chromium-driver/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, "engines": { @@ -2910,6 +3144,16 @@ "license": "MIT", "optional": true }, + "node_modules/appium-chromium-driver/node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "extraneous": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/appium-chromium-driver/node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2948,6 +3192,13 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, + "node_modules/appium-chromium-driver/node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -2958,9 +3209,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -3054,71 +3305,62 @@ "node": ">=0.8.x" } }, + "node_modules/appium-chromium-driver/node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/appium-chromium-driver/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, - "node_modules/appium-chromium-driver/node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "node_modules/appium-chromium-driver/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "extraneous": true, "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/fast-fifo": { @@ -3127,6 +3369,23 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "license": "MIT" }, + "node_modules/appium-chromium-driver/node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "extraneous": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/appium-chromium-driver/node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -3136,39 +3395,30 @@ "node": ">= 4.9.1" } }, + "node_modules/appium-chromium-driver/node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { "node": ">= 0.8" } }, - "node_modules/appium-chromium-driver/node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/appium-chromium-driver/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3185,10 +3435,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/appium-chromium-driver/node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -3206,12 +3463,12 @@ } }, "node_modules/appium-chromium-driver/node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -3234,20 +3491,42 @@ } }, "node_modules/appium-chromium-driver/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, + "node_modules/appium-chromium-driver/node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-chromium-driver/node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/appium-chromium-driver/node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3258,12 +3537,12 @@ } }, "node_modules/appium-chromium-driver/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/appium-chromium-driver/node_modules/ftp-response-parser": { @@ -3320,18 +3599,31 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/appium-chromium-driver/node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/appium-chromium-driver/node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -3370,44 +3662,38 @@ } }, "node_modules/appium-chromium-driver/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-chromium-driver/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/appium-chromium-driver/node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3568,6 +3854,15 @@ "node": ">= 0.8" } }, + "node_modules/appium-chromium-driver/node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-chromium-driver/node_modules/http-status-codes": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", @@ -3575,12 +3870,12 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -3606,17 +3901,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/appium-chromium-driver/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/appium-chromium-driver/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -3624,12 +3908,12 @@ "license": "ISC" }, "node_modules/appium-chromium-driver/node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/appium-chromium-driver/node_modules/ipaddr.js": { @@ -3671,6 +3955,22 @@ "node": ">=8" } }, + "node_modules/appium-chromium-driver/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/appium-chromium-driver/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -3705,18 +4005,18 @@ } }, "node_modules/appium-chromium-driver/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/appium-chromium-driver/node_modules/js-tokens": { @@ -3763,6 +4063,13 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "license": "(AFL-2.1 OR BSD-3-Clause)" }, + "node_modules/appium-chromium-driver/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/klaw": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", @@ -3772,6 +4079,23 @@ "node": ">=14.14.0" } }, + "node_modules/appium-chromium-driver/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/appium-chromium-driver/node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -3820,6 +4144,19 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/appium-chromium-driver/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/appium-chromium-driver/node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3872,18 +4209,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-chromium-driver/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "node_modules/appium-chromium-driver/node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "extraneous": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } }, "node_modules/appium-chromium-driver/node_modules/math-intrinsics": { "version": "1.1.0", @@ -3895,19 +4246,22 @@ } }, "node_modules/appium-chromium-driver/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/appium-chromium-driver/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -3952,21 +4306,21 @@ } }, "node_modules/appium-chromium-driver/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/appium-chromium-driver/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -3989,27 +4343,6 @@ "license": "ISC", "optional": true }, - "node_modules/appium-chromium-driver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/appium-chromium-driver/node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -4019,18 +4352,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/appium-chromium-driver/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/appium-chromium-driver/node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -4041,16 +4362,16 @@ } }, "node_modules/appium-chromium-driver/node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", "depd": "~2.0.0", "on-finished": "~2.3.0", - "on-headers": "~1.0.2" + "on-headers": "~1.1.0" }, "engines": { "node": ">= 0.8.0" @@ -4089,50 +4410,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/appium-chromium-driver/node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "license": "MIT", - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/appium-chromium-driver/node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -4143,9 +4420,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4213,9 +4490,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4230,6 +4507,16 @@ "wrappy": "1" } }, + "node_modules/appium-chromium-driver/node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/appium-chromium-driver/node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -4246,13 +4533,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-chromium-driver/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/appium-chromium-driver/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "extraneous": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { "node": ">=10" @@ -4261,21 +4557,72 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-chromium-driver/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/appium-chromium-driver/node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "extraneous": true, "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" - }, + "node": ">=8" + } + }, + "node_modules/appium-chromium-driver/node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/appium-chromium-driver/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/appium-chromium-driver/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/appium-chromium-driver/node_modules/package-changed": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", + "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", + "extraneous": true, + "license": "ISC", + "dependencies": { + "commander": "^6.2.0" + }, + "bin": { + "package-changed": "bin/package-changed.js" + } + }, "node_modules/appium-chromium-driver/node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -4326,15 +4673,6 @@ "node": ">=8" } }, - "node_modules/appium-chromium-driver/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/appium-chromium-driver/node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -4351,28 +4689,29 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/appium-chromium-driver/node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "engines": { - "node": ">=16" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/pend": { @@ -4413,15 +4752,6 @@ "node": ">=10.4.0" } }, - "node_modules/appium-chromium-driver/node_modules/plist/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/appium-chromium-driver/node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -4466,12 +4796,12 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -4490,18 +4820,34 @@ } }, "node_modules/appium-chromium-driver/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", + "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", + "iconv-lite": "0.7.0", "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" + } + }, + "node_modules/appium-chromium-driver/node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/read-pkg": { @@ -4578,9 +4924,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -4598,10 +4944,10 @@ "node": ">=10" } }, - "node_modules/appium-chromium-driver/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/appium-chromium-driver/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "extraneous": true, "license": "MIT", "engines": { @@ -4609,12 +4955,12 @@ } }, "node_modules/appium-chromium-driver/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4637,6 +4983,36 @@ "node": ">=8" } }, + "node_modules/appium-chromium-driver/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/appium-chromium-driver/node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/appium-chromium-driver/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4657,6 +5033,16 @@ ], "license": "MIT" }, + "node_modules/appium-chromium-driver/node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/appium-chromium-driver/node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -4680,9 +5066,9 @@ "optional": true }, "node_modules/appium-chromium-driver/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4692,106 +5078,65 @@ } }, "node_modules/appium-chromium-driver/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">= 18" } }, "node_modules/appium-chromium-driver/node_modules/serve-favicon": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", + "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", "dependencies": { "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", + "fresh": "~0.5.2", + "ms": "~2.1.3", "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" + "safe-buffer": "~5.2.1" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/appium-chromium-driver/node_modules/serve-favicon/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/serve-favicon/node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "license": "MIT" + "node_modules/appium-chromium-driver/node_modules/serve-favicon/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/appium-chromium-driver/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, "node_modules/appium-chromium-driver/node_modules/set-blocking": { @@ -4807,16 +5152,16 @@ "license": "ISC" }, "node_modules/appium-chromium-driver/node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -4825,25 +5170,30 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/appium-chromium-driver/node_modules/shebang-command": { @@ -4868,9 +5218,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4957,23 +5307,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, - "node_modules/appium-chromium-driver/node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT", - "optional": true - }, "node_modules/appium-chromium-driver/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5020,9 +5353,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "license": "CC0-1.0" }, "node_modules/appium-chromium-driver/node_modules/spdy": { @@ -5072,10 +5405,20 @@ "node": ">= 6" } }, + "node_modules/appium-chromium-driver/node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/appium-chromium-driver/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5101,16 +5444,14 @@ } }, "node_modules/appium-chromium-driver/node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/appium-chromium-driver/node_modules/string_decoder": { @@ -5182,9 +5523,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -5245,6 +5586,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/appium-chromium-driver/node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/appium-chromium-driver/node_modules/tar-stream": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", @@ -5257,9 +5610,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/teen_process": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.2.3.tgz", - "integrity": "sha512-8L540OalWH83qc6LHV5VMr0DjdP7KWUHQwTOImtWaG2ElW8BvLTh6M9871oGmmpOMb2BpOJQn2+09ZHWYsdTUA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", + "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", "dependencies": { "bluebird": "^3.7.2", @@ -5268,8 +5621,8 @@ "source-map-support": "^0.x" }, "engines": { - "node": "^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-chromium-driver/node_modules/text-decoder": { @@ -5281,6 +5634,13 @@ "b4a": "^1.6.4" } }, + "node_modules/appium-chromium-driver/node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -5296,7 +5656,17 @@ "node": ">=0.6" } }, - "node_modules/appium-chromium-driver/node_modules/truncate-utf8-bytes": { + "node_modules/appium-chromium-driver/node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", @@ -5313,44 +5683,34 @@ "license": "0BSD" }, "node_modules/appium-chromium-driver/node_modules/type-fest": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", - "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", + "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/appium-chromium-driver/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" } }, - "node_modules/appium-chromium-driver/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "extraneous": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/appium-chromium-driver/node_modules/unorm": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", @@ -5381,26 +5741,17 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/appium-chromium-driver/node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/appium-chromium-driver/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/appium-chromium-driver/node_modules/validate-npm-package-license": { @@ -5413,12 +5764,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/appium-chromium-driver/node_modules/validate.js": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz", - "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==", - "license": "MIT" - }, "node_modules/appium-chromium-driver/node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5438,10 +5783,20 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/appium-chromium-driver/node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/appium-chromium-driver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -5450,7 +5805,75 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/winston": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", + "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/appium-chromium-driver/node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/appium-chromium-driver/node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/appium-chromium-driver/node_modules/wrap-ansi": { @@ -5582,9 +6005,9 @@ "license": "ISC" }, "node_modules/appium-chromium-driver/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "extraneous": true, "license": "MIT", "engines": { @@ -5631,78 +6054,70 @@ "node": ">=10" } }, + "node_modules/appium-chromium-driver/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "extraneous": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/appium-chromium-driver/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "extraneous": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^7.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/appium-chromium-driver/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "extraneous": true, "license": "ISC", "engines": { - "node": ">=12" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "extraneous": true, "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "extraneous": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "node": ">=18" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/appium-chromium-driver/node_modules/yauzl": { @@ -5727,16 +6142,6 @@ "node": "*" } }, - "node_modules/appium-chromium-driver/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/appium-chromium-driver/node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -5764,13 +6169,13 @@ } }, "node_modules/appium-geckodriver": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/appium-geckodriver/-/appium-geckodriver-1.4.3.tgz", - "integrity": "sha512-6P+NPls0vsruWyck4jz7E63zlCL6bvePdsopql1XrlUCONm+CHZBz2gs3zlejc5IiKWHd1BGMw1vMVZuLc1Teg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/appium-geckodriver/-/appium-geckodriver-2.1.1.tgz", + "integrity": "sha512-+/RXmDgbPACzNTzbYGyUm/vLJSvlY2ehg6BU0fNycjBURv9Nmp07nNOUcfWQ99aR6OnoETeQNTgrl8qM8DXVug==", "hasShrinkwrap": true, "license": "Apache-2.0", "dependencies": { - "appium-adb": "^12.0.3", + "appium-adb": "^14.0.0", "asyncbox": "^3.0.0", "axios": "^1.7.7", "bluebird": "^3.5.1", @@ -5779,72 +6184,168 @@ "semver": "^7.6.3", "source-map-support": "^0.x", "tar-stream": "^3.1.7", - "teen_process": "^2.0.0" + "teen_process": "^3.0.0" }, "engines": { - "node": ">=14", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" }, "peerDependencies": { - "appium": "^2.4.1" + "appium": "^3.0.0-rc.2" + } + }, + "node_modules/appium-geckodriver/node_modules/@appium/base-driver": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", + "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/support": "^7.0.3", + "@appium/types": "^1.1.1", + "@colors/colors": "1.6.0", + "async-lock": "1.4.1", + "asyncbox": "3.0.0", + "axios": "1.13.2", + "bluebird": "3.7.2", + "body-parser": "2.2.0", + "express": "5.1.0", + "fastest-levenshtein": "1.0.16", + "http-status-codes": "2.3.0", + "lodash": "4.17.21", + "lru-cache": "11.2.2", + "method-override": "3.0.0", + "morgan": "1.10.1", + "path-to-regexp": "8.3.0", + "serve-favicon": "2.5.1", + "source-map-support": "0.5.21", + "type-fest": "5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + }, + "optionalDependencies": { + "spdy": "4.0.2" + } + }, + "node_modules/appium-geckodriver/node_modules/@appium/base-plugin": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", + "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/base-driver": "^10.1.1", + "@appium/support": "^7.0.3" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/appium-geckodriver/node_modules/@appium/docutils": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", + "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/support": "^7.0.3", + "chalk": "4.1.2", + "consola": "3.4.2", + "diff": "8.0.2", + "lilconfig": "3.1.3", + "lodash": "4.17.21", + "pkg-dir": "5.0.0", + "read-pkg": "5.2.0", + "source-map-support": "0.5.21", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "yaml": "2.8.1", + "yargs": "18.0.0", + "yargs-parser": "22.0.0" + }, + "bin": { + "appium-docs": "bin/appium-docs.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/appium-geckodriver/node_modules/@appium/docutils/node_modules/teen_process": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", + "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-geckodriver/node_modules/@appium/logger": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-1.6.1.tgz", - "integrity": "sha512-3TWpLR1qVQ0usLJ6R49iN4TV9Zs0nog1oL3hakCglwP0g4ZllwwEbp+2b1ovJfX6oOv1wXNREyokq2uxU5gB/Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", + "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", "license": "ISC", "dependencies": { "console-control-strings": "1.1.0", "lodash": "4.17.21", - "lru-cache": "10.4.3", + "lru-cache": "11.2.2", "set-blocking": "2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-geckodriver/node_modules/@appium/schema": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.8.1.tgz", - "integrity": "sha512-3yzfQ/K7RMGnfYDgFG7JdCPsjjN3eS33n2SBeGJtd28mDtgO7EzcmtiUBQjbkxyu0Q7h8KOexiqndvgTCgHeGQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", + "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-geckodriver/node_modules/@appium/support": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-6.0.6.tgz", - "integrity": "sha512-qgj1uxHF7Suqi8wdWFBrG12dhLMAthpX973L7JHutM2jneynoIUaKtSXdd6zg0ZG/9clfY0C/06pIQTQljj+Lg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", + "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^1.6.1", - "@appium/tsconfig": "^0.3.4", - "@appium/types": "^0.25.1", + "@appium/logger": "^2.0.2", + "@appium/tsconfig": "^1.1.0", + "@appium/types": "^1.1.1", "@colors/colors": "1.6.0", "archiver": "7.0.1", - "axios": "1.7.9", + "axios": "1.13.2", "base64-stream": "1.0.0", "bluebird": "3.7.2", "bplist-creator": "0.1.1", "bplist-parser": "0.3.2", - "form-data": "4.0.2", + "form-data": "4.0.4", "get-stream": "6.0.1", - "glob": "10.4.5", + "glob": "11.0.3", "jsftp": "2.1.3", "klaw": "4.1.0", "lockfile": "1.0.4", "lodash": "4.17.21", "log-symbols": "4.1.0", "moment": "2.30.1", - "mv": "2.1.1", "ncp": "2.0.0", "pkg-dir": "5.0.0", "plist": "3.1.0", @@ -5852,71 +6353,87 @@ "read-pkg": "5.2.0", "resolve-from": "5.0.0", "sanitize-filename": "1.6.3", - "semver": "7.7.1", - "shell-quote": "1.8.2", + "semver": "7.7.3", + "shell-quote": "1.8.3", "source-map-support": "0.5.21", "supports-color": "8.1.1", - "teen_process": "2.2.3", - "type-fest": "4.35.0", - "uuid": "11.1.0", - "which": "4.0.0", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "uuid": "13.0.0", + "which": "5.0.0", "yauzl": "3.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" }, "optionalDependencies": { - "sharp": "0.33.5" + "sharp": "0.34.5" + } + }, + "node_modules/appium-geckodriver/node_modules/@appium/support/node_modules/teen_process": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", + "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", + "license": "Apache-2.0", + "dependencies": { + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-geckodriver/node_modules/@appium/tsconfig": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.4.tgz", - "integrity": "sha512-tX719/ekarAWmJb+AaG6//8+3qQITshTgTZor0EbdEwA2KG3bGPwMIoCp10np6/qFr+sMZC0CbuKJruHSCDhhw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", + "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", "license": "Apache-2.0", "dependencies": { - "@tsconfig/node14": "14.1.2" + "@tsconfig/node20": "20.1.6" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-geckodriver/node_modules/@appium/types": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.25.1.tgz", - "integrity": "sha512-2Lu5qwFNQa+iPw98XdB5/7tXKO7dugZHXfAsF050wgJkJJ4kDemVFJ4yr1YqM7DYmgqZnt+k0EfzshLODCHXTA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", + "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^1.6.1", - "@appium/schema": "^0.8.1", - "@appium/tsconfig": "^0.3.4", - "type-fest": "4.35.0" + "@appium/logger": "^2.0.2", + "@appium/schema": "^1.0.0", + "@appium/tsconfig": "^1.1.0", + "type-fest": "5.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-geckodriver/node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/appium-geckodriver/node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -5931,42 +6448,42 @@ "node": ">=0.1.90" } }, - "node_modules/appium-geckodriver/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-geckodriver/node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/appium-geckodriver/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", + "node_modules/appium-geckodriver/node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "extraneous": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/appium-geckodriver/node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, "node_modules/appium-geckodriver/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -5980,9 +6497,9 @@ } }, "node_modules/appium-geckodriver/node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], @@ -5998,7 +6515,28 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/appium-geckodriver/node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/appium-geckodriver/node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/appium-geckodriver/node_modules/@isaacs/cliui": { @@ -6019,9 +6557,9 @@ } }, "node_modules/appium-geckodriver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", "engines": { "node": ">=12" @@ -6057,10 +6595,37 @@ "node": ">=14" } }, - "node_modules/appium-geckodriver/node_modules/@tsconfig/node14": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.2.tgz", - "integrity": "sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q==", + "node_modules/appium-geckodriver/node_modules/@sidvind/better-ajv-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", + "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "kleur": "^4.1.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "ajv": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/appium-geckodriver/node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "peer": true, + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/appium-geckodriver/node_modules/@tsconfig/node20": { + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", + "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/@types/normalize-package-data": { @@ -6069,10 +6634,17 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT", + "peer": true + }, "node_modules/appium-geckodriver/node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -6090,10 +6662,42 @@ "node": ">=6.5" } }, + "node_modules/appium-geckodriver/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "peer": true, + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/appium-geckodriver/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { "node": ">=12" @@ -6117,26 +6721,89 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/appium-geckodriver/node_modules/appium": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.1.tgz", + "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/base-driver": "^10.1.1", + "@appium/base-plugin": "^3.0.4", + "@appium/docutils": "^2.1.2", + "@appium/logger": "^2.0.2", + "@appium/schema": "^1.0.0", + "@appium/support": "^7.0.3", + "@appium/types": "^1.1.1", + "@sidvind/better-ajv-errors": "4.0.0", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "argparse": "2.0.1", + "async-lock": "1.4.1", + "asyncbox": "3.0.0", + "axios": "1.13.2", + "bluebird": "3.7.2", + "lilconfig": "3.1.3", + "lodash": "4.17.21", + "lru-cache": "11.2.2", + "ora": "5.4.1", + "package-changed": "3.0.0", + "resolve-from": "5.0.0", + "semver": "7.7.3", + "source-map-support": "0.5.21", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "winston": "3.18.3", + "wrap-ansi": "7.0.0", + "ws": "8.18.3", + "yaml": "2.8.1" + }, + "bin": { + "appium": "index.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, "node_modules/appium-geckodriver/node_modules/appium-adb": { - "version": "12.12.1", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-12.12.1.tgz", - "integrity": "sha512-CgdvLBBtLkZeObJegsCQo2eUTzuHESkeewbfWROFNtrVmxKS30J9y9YV4h5WIYJbyhgQCJeX+yDa+1gO/ejFjA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.0.3.tgz", + "integrity": "sha512-fJIEikjVoKsj9PfM2iPBn4kEMHy78ZY6PBC4pTiSv0rlAgxnScQW9OLm2l4wEaE8ODwnY2zJZDHehEGZ2b79fg==", "license": "Apache-2.0", "dependencies": { - "@appium/support": "^6.0.0", + "@appium/support": "^7.0.0-rc.1", "async-lock": "^1.0.0", "asyncbox": "^3.0.0", "bluebird": "^3.4.7", - "ini": "^5.0.0", + "ini": "^6.0.0", "lodash": "^4.0.0", - "lru-cache": "^10.0.0", + "lru-cache": "^11.1.0", "semver": "^7.0.0", "source-map-support": "^0.x", - "teen_process": "^2.2.0" + "teen_process": "^3.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/appium-geckodriver/node_modules/appium/node_modules/teen_process": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", + "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" }, "engines": { - "node": ">=14", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-geckodriver/node_modules/archiver": { @@ -6175,19 +6842,93 @@ "node": ">= 14" } }, - "node_modules/appium-geckodriver/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/appium-geckodriver/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "extraneous": true, - "license": "Python-2.0" + "license": "Python-2.0", + "peer": true }, "node_modules/appium-geckodriver/node_modules/async": { "version": "3.2.6", @@ -6222,21 +6963,29 @@ "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "node_modules/appium-geckodriver/node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/appium-geckodriver/node_modules/balanced-match": { "version": "1.0.2", @@ -6245,11 +6994,18 @@ "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", - "optional": true + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/appium-geckodriver/node_modules/base64-js": { "version": "1.5.1", @@ -6277,6 +7033,19 @@ "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -6286,25 +7055,73 @@ "node": ">=0.6" } }, - "node_modules/appium-geckodriver/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", + "node_modules/appium-geckodriver/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", + "peer": true, "dependencies": { - "stream-buffers": "2.2.x" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/appium-geckodriver/node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "node_modules/appium-geckodriver/node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/appium-geckodriver/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/appium-geckodriver/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "peer": true, + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/appium-geckodriver/node_modules/bplist-creator": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", + "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/appium-geckodriver/node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "dependencies": { "big-integer": "1.6.x" @@ -6313,14 +7130,29 @@ "node": ">= 5.10.0" } }, - "node_modules/appium-geckodriver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/appium-geckodriver/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "node_modules/appium-geckodriver/node_modules/buffer-crc32": { @@ -6338,6 +7170,16 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -6351,6 +7193,23 @@ "node": ">= 0.4" } }, + "node_modules/appium-geckodriver/node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/appium-geckodriver/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -6379,78 +7238,125 @@ "node": ">=8" } }, + "node_modules/appium-geckodriver/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/appium-geckodriver/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/appium-geckodriver/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "extraneous": true, + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", + "peer": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=12" + "node": ">=20" } }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, + "node_modules/appium-geckodriver/node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/appium-geckodriver/node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, + "node_modules/appium-geckodriver/node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", + "peer": true, "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/appium-geckodriver/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8" } }, "node_modules/appium-geckodriver/node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "optional": true, + "peer": true, "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" }, "engines": { - "node": ">=12.5.0" + "node": ">=18" } }, "node_modules/appium-geckodriver/node_modules/color-convert": { @@ -6472,14 +7378,49 @@ "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "optional": true, + "peer": true, + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/appium-geckodriver/node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/appium-geckodriver/node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "peer": true, "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/appium-geckodriver/node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.20" } }, "node_modules/appium-geckodriver/node_modules/combined-stream": { @@ -6494,6 +7435,16 @@ "node": ">= 0.8" } }, + "node_modules/appium-geckodriver/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/appium-geckodriver/node_modules/compress-commons": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", @@ -6510,11 +7461,15 @@ "node": ">= 14" } }, - "node_modules/appium-geckodriver/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "node_modules/appium-geckodriver/node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/appium-geckodriver/node_modules/console-control-strings": { "version": "1.1.0", @@ -6522,6 +7477,50 @@ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC" }, + "node_modules/appium-geckodriver/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/appium-geckodriver/node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/appium-geckodriver/node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -6553,13 +7552,6 @@ "node": ">= 14" } }, - "node_modules/appium-geckodriver/node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "extraneous": true, - "license": "MIT" - }, "node_modules/appium-geckodriver/node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -6596,11 +7588,11 @@ } }, "node_modules/appium-geckodriver/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "extraneous": true, + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -6613,25 +7605,66 @@ } } }, - "node_modules/appium-geckodriver/node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", + "node_modules/appium-geckodriver/node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "peer": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/appium-geckodriver/node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/appium-geckodriver/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" } }, + "node_modules/appium-geckodriver/node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/appium-geckodriver/node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -6658,16 +7691,40 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT", + "peer": true + }, "node_modules/appium-geckodriver/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -6722,12 +7779,29 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "extraneous": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } }, + "node_modules/appium-geckodriver/node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/appium-geckodriver/node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -6746,22 +7820,123 @@ "node": ">=0.8.x" } }, + "node_modules/appium-geckodriver/node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/appium-geckodriver/node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "peer": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/appium-geckodriver/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-geckodriver/node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "extraneous": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/appium-geckodriver/node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "extraneous": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 4.9.1" } }, + "node_modules/appium-geckodriver/node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -6778,10 +7953,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/appium-geckodriver/node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT", + "peer": true + }, "node_modules/appium-geckodriver/node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -6799,12 +7981,12 @@ } }, "node_modules/appium-geckodriver/node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -6827,20 +8009,62 @@ } }, "node_modules/appium-geckodriver/node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, + "node_modules/appium-geckodriver/node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/ftp-response-parser": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", @@ -6889,24 +8113,37 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "extraneous": true, "license": "ISC", + "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/appium-geckodriver/node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/appium-geckodriver/node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -6945,44 +8182,38 @@ } }, "node_modules/appium-geckodriver/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-geckodriver/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/appium-geckodriver/node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7006,10 +8237,18 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/appium-geckodriver/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/appium-geckodriver/node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -7060,6 +8299,105 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "license": "ISC" }, + "node_modules/appium-geckodriver/node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/appium-geckodriver/node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/appium-geckodriver/node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/appium-geckodriver/node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -7080,17 +8418,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/appium-geckodriver/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/appium-geckodriver/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -7098,12 +8425,22 @@ "license": "ISC" }, "node_modules/appium-geckodriver/node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/appium-geckodriver/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.10" } }, "node_modules/appium-geckodriver/node_modules/is-arrayish": { @@ -7136,6 +8473,16 @@ "node": ">=8" } }, + "node_modules/appium-geckodriver/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/appium-geckodriver/node_modules/is-number-like": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", @@ -7145,6 +8492,13 @@ "lodash.isfinite": "^3.3.2" } }, + "node_modules/appium-geckodriver/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT", + "peer": true + }, "node_modules/appium-geckodriver/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -7179,18 +8533,18 @@ } }, "node_modules/appium-geckodriver/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/appium-geckodriver/node_modules/js-tokens": { @@ -7237,6 +8591,13 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "license": "(AFL-2.1 OR BSD-3-Clause)" }, + "node_modules/appium-geckodriver/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "extraneous": true, + "license": "MIT" + }, "node_modules/appium-geckodriver/node_modules/klaw": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", @@ -7246,6 +8607,23 @@ "node": ">=14.14.0" } }, + "node_modules/appium-geckodriver/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/appium-geckodriver/node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT", + "peer": true + }, "node_modules/appium-geckodriver/node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -7279,12 +8657,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -7294,6 +8666,19 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/appium-geckodriver/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/appium-geckodriver/node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -7352,18 +8737,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-geckodriver/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "node_modules/appium-geckodriver/node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } }, - "node_modules/appium-geckodriver/node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "extraneous": true, - "license": "ISC" + "node_modules/appium-geckodriver/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } }, "node_modules/appium-geckodriver/node_modules/math-intrinsics": { "version": "1.1.0", @@ -7374,80 +8773,127 @@ "node": ">= 0.4" } }, - "node_modules/appium-geckodriver/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/appium-geckodriver/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/appium-geckodriver/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/appium-geckodriver/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-geckodriver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "extraneous": true, + "node_modules/appium-geckodriver/node_modules/method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" }, "engines": { - "node": "*" + "node": ">= 0.10" } }, - "node_modules/appium-geckodriver/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/appium-geckodriver/node_modules/method-override/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peer": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/appium-geckodriver/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } + "node_modules/appium-geckodriver/node_modules/method-override/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", + "peer": true }, - "node_modules/appium-geckodriver/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/appium-geckodriver/node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "peer": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/appium-geckodriver/node_modules/moment": { + "node_modules/appium-geckodriver/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/appium-geckodriver/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/appium-geckodriver/node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/appium-geckodriver/node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", @@ -7456,56 +8902,59 @@ "node": "*" } }, - "node_modules/appium-geckodriver/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "node_modules/appium-geckodriver/node_modules/morgan": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", + "peer": true, "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.1.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.8.0" } }, - "node_modules/appium-geckodriver/node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "node_modules/appium-geckodriver/node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "peer": true, "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "ms": "2.0.0" } }, - "node_modules/appium-geckodriver/node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", + "node_modules/appium-geckodriver/node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "peer": true, "dependencies": { - "glob": "^6.0.1" + "ee-first": "1.1.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.8" } }, + "node_modules/appium-geckodriver/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/appium-geckodriver/node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -7515,6 +8964,16 @@ "ncp": "bin/ncp" } }, + "node_modules/appium-geckodriver/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/appium-geckodriver/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -7545,6 +9004,50 @@ "node": ">=0.10.0" } }, + "node_modules/appium-geckodriver/node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/appium-geckodriver/node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/appium-geckodriver/node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7554,12 +9057,22 @@ "wrappy": "1" } }, + "node_modules/appium-geckodriver/node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "peer": true, + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/appium-geckodriver/node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "extraneous": true, "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -7570,6 +9083,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/appium-geckodriver/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/appium-geckodriver/node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/appium-geckodriver/node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/appium-geckodriver/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7600,6 +9160,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/appium-geckodriver/node_modules/package-changed": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", + "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", + "license": "ISC", + "peer": true, + "dependencies": { + "commander": "^6.2.0" + }, + "bin": { + "package-changed": "bin/package-changed.js" + } + }, "node_modules/appium-geckodriver/node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -7632,6 +9205,16 @@ "node": ">=0.6.21" } }, + "node_modules/appium-geckodriver/node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7641,15 +9224,6 @@ "node": ">=8" } }, - "node_modules/appium-geckodriver/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/appium-geckodriver/node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -7666,21 +9240,32 @@ "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/appium-geckodriver/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/appium-geckodriver/node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -7766,32 +9351,105 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "peer": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/appium-geckodriver/node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/appium-geckodriver/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", + "node_modules/appium-geckodriver/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "side-channel": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-geckodriver/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", + "node_modules/appium-geckodriver/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "peer": true, + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/appium-geckodriver/node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/appium-geckodriver/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/appium-geckodriver/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -7846,9 +9504,9 @@ } }, "node_modules/appium-geckodriver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -7866,10 +9524,10 @@ "node": ">=10" } }, - "node_modules/appium-geckodriver/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/appium-geckodriver/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "extraneous": true, "license": "MIT", "engines": { @@ -7877,12 +9535,12 @@ } }, "node_modules/appium-geckodriver/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7905,32 +9563,59 @@ "node": ">=8" } }, + "node_modules/appium-geckodriver/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/appium-geckodriver/node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/appium-geckodriver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/appium-geckodriver/node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/sanitize-filename": { "version": "1.6.3", @@ -7941,10 +9626,18 @@ "truncate-utf8-bytes": "^1.0.0" } }, + "node_modules/appium-geckodriver/node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/appium-geckodriver/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7953,23 +9646,117 @@ "node": ">=10" } }, + "node_modules/appium-geckodriver/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/appium-geckodriver/node_modules/serve-favicon": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", + "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "etag": "~1.8.1", + "fresh": "~0.5.2", + "ms": "~2.1.3", + "parseurl": "~1.3.2", + "safe-buffer": "~5.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/appium-geckodriver/node_modules/serve-favicon/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/appium-geckodriver/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/appium-geckodriver/node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "license": "ISC" }, + "node_modules/appium-geckodriver/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC", + "peer": true + }, "node_modules/appium-geckodriver/node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -7978,25 +9765,30 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/appium-geckodriver/node_modules/shebang-command": { @@ -8021,9 +9813,9 @@ } }, "node_modules/appium-geckodriver/node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -8032,53 +9824,112 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-geckodriver/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "node_modules/appium-geckodriver/node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "optional": true, + "peer": true, "dependencies": { - "is-arrayish": "^0.3.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-geckodriver/node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "node_modules/appium-geckodriver/node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-geckodriver/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/appium-geckodriver/node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", + "peer": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/appium-geckodriver/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/appium-geckodriver/node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/appium-geckodriver/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/appium-geckodriver/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/appium-geckodriver/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/appium-geckodriver/node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -8101,11 +9952,81 @@ } }, "node_modules/appium-geckodriver/node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "license": "CC0-1.0" }, + "node_modules/appium-geckodriver/node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/appium-geckodriver/node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/appium-geckodriver/node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/appium-geckodriver/node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/appium-geckodriver/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/stream-buffers": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", @@ -8126,16 +10047,14 @@ } }, "node_modules/appium-geckodriver/node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/appium-geckodriver/node_modules/string_decoder": { @@ -8147,6 +10066,26 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/appium-geckodriver/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/appium-geckodriver/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -8207,9 +10146,9 @@ } }, "node_modules/appium-geckodriver/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -8270,6 +10209,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/appium-geckodriver/node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/appium-geckodriver/node_modules/tar-stream": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", @@ -8282,9 +10233,9 @@ } }, "node_modules/appium-geckodriver/node_modules/teen_process": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.2.3.tgz", - "integrity": "sha512-8L540OalWH83qc6LHV5VMr0DjdP7KWUHQwTOImtWaG2ElW8BvLTh6M9871oGmmpOMb2BpOJQn2+09ZHWYsdTUA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.3.tgz", + "integrity": "sha512-pYAojbLkaqXHpgze5AEdchW71OKownDPpqYpLTQsU/pUGMv3zr4yo2mSv/NnRAkRmsrNF2BP9byh2MVk9Y5H9A==", "license": "Apache-2.0", "dependencies": { "bluebird": "^3.7.2", @@ -8293,8 +10244,8 @@ "source-map-support": "^0.x" }, "engines": { - "node": "^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-geckodriver/node_modules/text-decoder": { @@ -8306,12 +10257,39 @@ "b4a": "^1.6.4" } }, + "node_modules/appium-geckodriver/node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT", + "peer": true + }, "node_modules/appium-geckodriver/node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, + "node_modules/appium-geckodriver/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/appium-geckodriver/node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/appium-geckodriver/node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -8329,29 +10307,33 @@ "license": "0BSD" }, "node_modules/appium-geckodriver/node_modules/type-fest": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", - "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", + "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-geckodriver/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "extraneous": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/appium-geckodriver/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "peer": true, + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { - "node": ">=14.17" + "node": ">= 0.6" } }, "node_modules/appium-geckodriver/node_modules/unorm": { @@ -8363,6 +10345,16 @@ "node": ">= 0.4.0" } }, + "node_modules/appium-geckodriver/node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/appium-geckodriver/node_modules/utf8-byte-length": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", @@ -8376,16 +10368,16 @@ "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/appium-geckodriver/node_modules/validate-npm-package-license": { @@ -8398,10 +10390,41 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/appium-geckodriver/node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/appium-geckodriver/node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/appium-geckodriver/node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "peer": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/appium-geckodriver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -8410,32 +10433,100 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "extraneous": true, + "node_modules/appium-geckodriver/node_modules/winston": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", + "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 12.0.0" } }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/appium-geckodriver/node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "peer": true, + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/appium-geckodriver/node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/appium-geckodriver/node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/appium-geckodriver/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -8494,8 +10585,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -8504,15 +10595,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8526,8 +10617,8 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8542,11 +10633,11 @@ "license": "ISC" }, "node_modules/appium-geckodriver/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "extraneous": true, + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -8576,84 +10667,76 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "extraneous": true, "license": "ISC", + "peer": true, "engines": { "node": ">=10" } }, + "node_modules/appium-geckodriver/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/appium-geckodriver/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "extraneous": true, + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", + "peer": true, "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^7.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/appium-geckodriver/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "extraneous": true, + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", + "peer": true, "engines": { - "node": ">=12" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/appium-geckodriver/node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "node": ">=18" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/appium-geckodriver/node_modules/yauzl": { @@ -8678,16 +10761,6 @@ "node": "*" } }, - "node_modules/appium-geckodriver/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/appium-geckodriver/node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -8715,96 +10788,261 @@ } }, "node_modules/appium-safari-driver": { - "version": "3.5.25", - "resolved": "https://registry.npmjs.org/appium-safari-driver/-/appium-safari-driver-3.5.25.tgz", - "integrity": "sha512-fdT+4Pp8iPd6eM+OwVZmhYtRKoVPv7DBxqXNxksnLk58J2kGQM4LCdwAA49rRg+k6gwMzQSrMt/3z8ttLfyinw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/appium-safari-driver/-/appium-safari-driver-4.1.0.tgz", + "integrity": "sha512-dC+A+W9gwKOEDeogfAwtLVieYk7KfldJ52ac8bZvws5pfMFOCSiuUhvtSClujnxcalb/zLBhnIeijCsWq3V3SA==", "hasShrinkwrap": true, "license": "Apache-2.0", "dependencies": { "asyncbox": "^3.0.0", "bluebird": "^3.5.1", "lodash": "^4.17.4", - "node-simctl": "^7.0.1", + "node-simctl": "^8.0.0", "portscanner": "2.2.0", "source-map-support": "^0.x", - "teen_process": "^2.0.0" + "teen_process": "^3.0.0" }, "engines": { - "node": ">=14", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" }, "peerDependencies": { - "appium": "^2.0.0" + "appium": "^3.0.0-rc.2" + } + }, + "node_modules/appium-safari-driver/node_modules/@appium/base-driver": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", + "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/support": "^7.0.3", + "@appium/types": "^1.1.1", + "@colors/colors": "1.6.0", + "async-lock": "1.4.1", + "asyncbox": "3.0.0", + "axios": "1.13.2", + "bluebird": "3.7.2", + "body-parser": "2.2.0", + "express": "5.1.0", + "fastest-levenshtein": "1.0.16", + "http-status-codes": "2.3.0", + "lodash": "4.17.21", + "lru-cache": "11.2.2", + "method-override": "3.0.0", + "morgan": "1.10.1", + "path-to-regexp": "8.3.0", + "serve-favicon": "2.5.1", + "source-map-support": "0.5.21", + "type-fest": "5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + }, + "optionalDependencies": { + "spdy": "4.0.2" + } + }, + "node_modules/appium-safari-driver/node_modules/@appium/base-plugin": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", + "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/base-driver": "^10.1.1", + "@appium/support": "^7.0.3" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/appium-safari-driver/node_modules/@appium/docutils": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", + "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/support": "^7.0.3", + "chalk": "4.1.2", + "consola": "3.4.2", + "diff": "8.0.2", + "lilconfig": "3.1.3", + "lodash": "4.17.21", + "pkg-dir": "5.0.0", + "read-pkg": "5.2.0", + "source-map-support": "0.5.21", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "yaml": "2.8.1", + "yargs": "18.0.0", + "yargs-parser": "22.0.0" + }, + "bin": { + "appium-docs": "bin/appium-docs.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/appium-safari-driver/node_modules/@appium/docutils/node_modules/teen_process": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", + "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-safari-driver/node_modules/@appium/logger": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-1.7.1.tgz", - "integrity": "sha512-9C2o9X/lBEDBUnKfAi3mRo9oG7Z03nmISLwsGkWxIWjMAvBdJD0RRSJMekWVKzfXN3byrI1WlCXTITzN4LAoLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", + "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", "license": "ISC", "dependencies": { "console-control-strings": "1.1.0", "lodash": "4.17.21", - "lru-cache": "10.4.3", + "lru-cache": "11.2.2", "set-blocking": "2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-safari-driver/node_modules/@appium/schema": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.8.1.tgz", - "integrity": "sha512-3yzfQ/K7RMGnfYDgFG7JdCPsjjN3eS33n2SBeGJtd28mDtgO7EzcmtiUBQjbkxyu0Q7h8KOexiqndvgTCgHeGQ==", - "extraneous": true, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", + "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/appium-safari-driver/node_modules/@appium/support": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", + "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/logger": "^2.0.2", + "@appium/tsconfig": "^1.1.0", + "@appium/types": "^1.1.1", + "@colors/colors": "1.6.0", + "archiver": "7.0.1", + "axios": "1.13.2", + "base64-stream": "1.0.0", + "bluebird": "3.7.2", + "bplist-creator": "0.1.1", + "bplist-parser": "0.3.2", + "form-data": "4.0.4", + "get-stream": "6.0.1", + "glob": "11.0.3", + "jsftp": "2.1.3", + "klaw": "4.1.0", + "lockfile": "1.0.4", + "lodash": "4.17.21", + "log-symbols": "4.1.0", + "moment": "2.30.1", + "ncp": "2.0.0", + "pkg-dir": "5.0.0", + "plist": "3.1.0", + "pluralize": "8.0.0", + "read-pkg": "5.2.0", + "resolve-from": "5.0.0", + "sanitize-filename": "1.6.3", + "semver": "7.7.3", + "shell-quote": "1.8.3", + "source-map-support": "0.5.21", + "supports-color": "8.1.1", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "uuid": "13.0.0", + "which": "5.0.0", + "yauzl": "3.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + }, + "optionalDependencies": { + "sharp": "0.34.5" + } + }, + "node_modules/appium-safari-driver/node_modules/@appium/support/node_modules/teen_process": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", + "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-safari-driver/node_modules/@appium/tsconfig": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.5.tgz", - "integrity": "sha512-T8G5oe3is0Gn56PkeYjXracc0CS26L/obVuX7PHwEDcn1UKiJXFa2MYY73dRAWKJumAIIsJjssNUu6VttdWZWw==", - "extraneous": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", + "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@tsconfig/node14": "14.1.3" + "@tsconfig/node20": "20.1.6" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-safari-driver/node_modules/@appium/types": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.26.0.tgz", - "integrity": "sha512-EO7r3H9cd1WePt/Gtb+TKBeWulSKjtNHAxD0llqqQ5hFwfNHWcmdObHL/d8jkyG53E/f54VeBcjD+uCARRqDqw==", - "extraneous": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", + "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@appium/logger": "^1.7.1", - "@appium/schema": "^0.8.1", - "@appium/tsconfig": "^0.3.5", - "type-fest": "4.41.0" + "@appium/logger": "^2.0.2", + "@appium/schema": "^1.0.0", + "@appium/tsconfig": "^1.1.0", + "type-fest": "5.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/appium-safari-driver/node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "extraneous": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -8815,656 +11053,869 @@ } }, "node_modules/appium-safari-driver/node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "extraneous": true, + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/appium-safari-driver/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "license": "MIT", + "peer": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.1.90" } }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/appium-safari-driver/node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/appium-safari-driver/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/appium-safari-driver/node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "license": "MIT", "optional": true, - "engines": { - "node": ">=14" + "peer": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/appium-safari-driver/node_modules/@tsconfig/node14": { - "version": "14.1.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.3.tgz", - "integrity": "sha512-ZC9/Kq2c0+4l8sDx/z3YQyP7+OSMTQr/xxJaSFHLGhGL0t9bPjuX1Zwmg3C2VB5KWGgI8MXMRShXRJroy4utGA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=6.5" + "node": ">=18" } }, - "node_modules/appium-safari-driver/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, - "node_modules/appium-safari-driver/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/appium-safari-driver/node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">=8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" + "url": "https://opencollective.com/libvips" }, - "engines": { - "node": ">= 14" + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, - "node_modules/appium-safari-driver/node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/appium-safari-driver/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/appium-safari-driver/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "extraneous": true, - "license": "Python-2.0" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/appium-safari-driver/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/appium-safari-driver/node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/appium-safari-driver/node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "extraneous": true, - "license": "Apache-2.0" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/appium-safari-driver/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/appium-safari-driver/node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "extraneous": true, - "license": "Apache-2.0" - }, - "node_modules/appium-safari-driver/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" ], - "license": "MIT" + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/appium-safari-driver/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } }, - "node_modules/appium-safari-driver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/appium-safari-driver/node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "extraneous": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" } }, - "node_modules/appium-safari-driver/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" } }, - "node_modules/appium-safari-driver/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" + "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, - "node_modules/appium-safari-driver/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" } }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@emnapi/runtime": "^1.7.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">=8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/appium-safari-driver/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" + "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">=7.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/appium-safari-driver/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } }, - "node_modules/appium-safari-driver/node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": ">= 14" + "node": "20 || >=22" } }, - "node_modules/appium-safari-driver/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "extraneous": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" + "node_modules/appium-safari-driver/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=12" } }, - "node_modules/appium-safari-driver/node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, + "peer": true, "engines": { - "node": ">= 14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/appium-safari-driver/node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/appium-safari-driver/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", + "peer": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "node_modules/appium-safari-driver/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + } }, - "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/@sidvind/better-ajv-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", + "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "kleur": "^4.1.0" }, "engines": { - "node": ">= 8" + "node": ">= 18" + }, + "peerDependencies": { + "ajv": "^7.0.0 || ^8.0.0" } }, - "node_modules/appium-safari-driver/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", + "peer": true, "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "color": "^5.0.2", + "text-hex": "1.0.x" } }, - "node_modules/appium-safari-driver/node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/@tsconfig/node20": { + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", + "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } + "peer": true }, - "node_modules/appium-safari-driver/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", + "peer": true, "engines": { - "node": ">=6" + "node": ">=10.0.0" } }, - "node_modules/appium-safari-driver/node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", + "peer": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, "engines": { - "node": ">=6" + "node": ">=6.5" } }, - "node_modules/appium-safari-driver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", + "peer": true, + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, "engines": { - "node": ">=0.8.x" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "engines": { - "node": ">= 4.9.1" + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/appium-safari-driver/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "peer": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/appium-safari-driver/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "peer": true, "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/appium-safari-driver/node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/appium": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.1.tgz", + "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@appium/base-driver": "^10.1.1", + "@appium/base-plugin": "^3.0.4", + "@appium/docutils": "^2.1.2", + "@appium/logger": "^2.0.2", + "@appium/schema": "^1.0.0", + "@appium/support": "^7.0.3", + "@appium/types": "^1.1.1", + "@sidvind/better-ajv-errors": "4.0.0", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "argparse": "2.0.1", + "async-lock": "1.4.1", + "asyncbox": "3.0.0", + "axios": "1.13.2", + "bluebird": "3.7.2", + "lilconfig": "3.1.3", + "lodash": "4.17.21", + "lru-cache": "11.2.2", + "ora": "5.4.1", + "package-changed": "3.0.0", + "resolve-from": "5.0.0", + "semver": "7.7.3", + "source-map-support": "0.5.21", + "teen_process": "3.0.2", + "type-fest": "5.2.0", + "winston": "3.18.3", + "wrap-ansi": "7.0.0", + "ws": "8.18.3", + "yaml": "2.8.1" + }, + "bin": { + "appium": "index.js" + }, "engines": { - "node": ">=14" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" + } + }, + "node_modules/appium-safari-driver/node_modules/appium/node_modules/teen_process": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", + "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, - "node_modules/appium-safari-driver/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peer": true, + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/appium-safari-driver/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "extraneous": true, - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">= 14" } }, - "node_modules/appium-safari-driver/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/appium-safari-driver/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", + "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -9480,20 +11931,35 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-safari-driver/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0" + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/appium-safari-driver/node_modules/glob/node_modules/minimatch": { + "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9504,1397 +11970,1330 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-safari-driver/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "extraneous": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "peer": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-safari-driver/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/asyncbox": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", + "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", + "license": "Apache-2.0", "dependencies": { - "function-bind": "^1.1.2" + "bluebird": "^3.5.1", + "lodash": "^4.17.4", + "source-map-support": "^0.x" }, "engines": { - "node": ">= 0.4" + "node": ">=16" } }, - "node_modules/appium-safari-driver/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "extraneous": true, - "license": "ISC" + "node_modules/appium-safari-driver/node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, + "node_modules/appium-safari-driver/node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/appium-safari-driver/node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peer": true, + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/appium-safari-driver/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peer": true, + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/appium-safari-driver/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, { "type": "consulting", "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-safari-driver/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "extraneous": true, - "license": "ISC" + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/base64-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", + "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", + "peer": true, "dependencies": { - "hasown": "^2.0.2" + "safe-buffer": "5.1.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/appium-safari-driver/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "peer": true, "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/appium-safari-driver/node_modules/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "peer": true, "dependencies": { - "lodash.isfinite": "^3.3.2" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/appium-safari-driver/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "engines": { - "node": ">=8" + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 6" } }, - "node_modules/appium-safari-driver/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/appium-safari-driver/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "engines": { - "node": ">=10" + "peer": true, + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" } }, - "node_modules/appium-safari-driver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" + "node_modules/appium-safari-driver/node_modules/bplist-creator": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", + "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "stream-buffers": "2.2.x" } }, - "node_modules/appium-safari-driver/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", + "node_modules/appium-safari-driver/node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "license": "MIT", + "peer": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "big-integer": "1.6.x" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">= 5.10.0" } }, - "node_modules/appium-safari-driver/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, - "node_modules/appium-safari-driver/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/appium-safari-driver/node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, - "node_modules/appium-safari-driver/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "extraneous": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" + "node_modules/appium-safari-driver/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } }, - "node_modules/appium-safari-driver/node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", + "peer": true, "dependencies": { - "readable-stream": "^2.0.5" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 0.6.3" + "node": ">= 0.4" } }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", + "peer": true, "dependencies": { - "p-locate": "^5.0.0" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-safari-driver/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", + "peer": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/appium-safari-driver/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/appium-safari-driver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "extraneous": true, - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "restore-cursor": "^3.1.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/appium-safari-driver/node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "peer": true, "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/appium-safari-driver/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/node-simctl": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-7.7.3.tgz", - "integrity": "sha512-2KuVhn3MqQWFHtazYuAm+perIW1iXYSHFDoojEYVMspbMppb+JKILR4k+KfugLvuTNJCljL2D1GZ5utT9Sp4cQ==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^1.3.0", - "asyncbox": "^3.0.0", - "bluebird": "^3.5.1", - "lodash": "^4.2.1", - "rimraf": "^5.0.0", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^2.2.0", - "uuid": "^11.0.1", - "which": "^5.0.0" + "node": ">=6" }, - "engines": { - "node": ">=14", - "npm": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-safari-driver/node_modules/node-simctl/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "node_modules/appium-safari-driver/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", + "peer": true, "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/appium-safari-driver/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "extraneous": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "extraneous": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "node": ">=20" } }, - "node_modules/appium-safari-driver/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/appium-safari-driver/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } + "node_modules/appium-safari-driver/node_modules/cliui/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", + "peer": true, "dependencies": { - "mimic-fn": "^2.1.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-safari-driver/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", + "peer": true, "dependencies": { - "yocto-queue": "^0.1.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/appium-safari-driver/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/appium-safari-driver/node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", + "peer": true, "dependencies": { - "p-limit": "^3.0.2" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/appium-safari-driver/node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/appium-safari-driver/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", + "peer": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "node_modules/appium-safari-driver/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/appium-safari-driver/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/appium-safari-driver/node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=12.20" } }, - "node_modules/appium-safari-driver/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", + "node_modules/appium-safari-driver/node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "peer": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "color-name": "^2.0.0" }, "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14.6" } }, - "node_modules/appium-safari-driver/node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "node_modules/appium-safari-driver/node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - }, + "peer": true, "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" + "node": ">=12.20" } }, - "node_modules/appium-safari-driver/node_modules/portscanner/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/appium-safari-driver/node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", + "peer": true, "dependencies": { - "lodash": "^4.17.14" + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/appium-safari-driver/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.6.0" + "node": ">= 6" } }, - "node_modules/appium-safari-driver/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "license": "MIT", + "peer": true, "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 14" } }, - "node_modules/appium-safari-driver/node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/appium-safari-driver/node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "peer": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/appium-safari-driver/node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" + "node_modules/appium-safari-driver/node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/appium-safari-driver/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/appium-safari-driver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "peer": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/appium-safari-driver/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=6.6.0" } }, - "node_modules/appium-safari-driver/node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "peer": true, "bin": { - "resolve": "bin/resolve" + "crc32": "bin/crc32.njs" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8" } }, - "node_modules/appium-safari-driver/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/appium-safari-driver/node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "license": "MIT", + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/appium-safari-driver/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "peer": true, "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 8" } }, - "node_modules/appium-safari-driver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, "bin": { - "semver": "bin/semver.js" + "node-which": "bin/node-which" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/appium-safari-driver/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/appium-safari-driver/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", + "peer": true, "dependencies": { - "shebang-regex": "^3.0.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/appium-safari-driver/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/appium-safari-driver/node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "peer": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/appium-safari-driver/node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/appium-safari-driver/node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "node_modules/appium-safari-driver/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/appium-safari-driver/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "extraneous": true, - "license": "ISC" + "node_modules/appium-safari-driver/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/appium-safari-driver/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/appium-safari-driver/node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, - "node_modules/appium-safari-driver/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/appium-safari-driver/node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", + "peer": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/appium-safari-driver/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } + "node_modules/appium-safari-driver/node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "extraneous": true, - "license": "CC-BY-3.0" + "node_modules/appium-safari-driver/node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } + "peer": true }, - "node_modules/appium-safari-driver/node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "extraneous": true, - "license": "CC0-1.0" + "node_modules/appium-safari-driver/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/appium-safari-driver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", + "peer": true, "dependencies": { - "safe-buffer": "~5.2.0" + "is-arrayish": "^0.2.1" } }, - "node_modules/appium-safari-driver/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/appium-safari-driver/node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, + "peer": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/appium-safari-driver/node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/appium-safari-driver/node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/appium-safari-driver/node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", + "peer": true, "dependencies": { - "ansi-regex": "^5.0.1" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/appium-safari-driver/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/appium-safari-driver/node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "peer": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=6" } }, - "node_modules/appium-safari-driver/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/appium-safari-driver/node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "node_modules/appium-safari-driver/node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/appium-safari-driver/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/appium-safari-driver/node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/appium-safari-driver/node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 18" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/appium-safari-driver/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/appium-safari-driver/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "extraneous": true, + "license": "MIT" + }, + "node_modules/appium-safari-driver/node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "peer": true }, - "node_modules/appium-safari-driver/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/appium-safari-driver/node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "extraneous": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/appium-safari-driver/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "peer": true, + "engines": { + "node": ">= 4.9.1" } }, - "node_modules/appium-safari-driver/node_modules/teen_process": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.3.2.tgz", - "integrity": "sha512-eiYtJbYrMz5WbZL68u05qCgLMShPZhYKVewZFoyT6C2xvNdMfikCP7Nh0K3Phiy+H4bMZ8q5GtJROFcoYwQJmQ==", - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "peer": true, "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": "^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": ">= 0.8" } }, - "node_modules/appium-safari-driver/node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "extraneous": true, - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "peer": true, "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/appium-safari-driver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "extraneous": true, - "license": "0BSD" - }, - "node_modules/appium-safari-driver/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "extraneous": true, - "license": "(MIT OR CC0-1.0)", + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-safari-driver/node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "extraneous": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/appium-safari-driver/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "extraneous": true, - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "node_modules/appium-safari-driver/node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } ], "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/appium-safari-driver/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "peer": true, + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/appium-safari-driver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", + "peer": true, "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/appium-safari-driver/node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "peer": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/appium-safari-driver/node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 6" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/appium-safari-driver/node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/appium-safari-driver/node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/appium-safari-driver/node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/ftp-response-parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", + "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "readable-stream": "^1.0.31" }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "peer": true }, - "node_modules/appium-safari-driver/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "extraneous": true, - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/appium-safari-driver/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": ">=10" - } + "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT", + "peer": true }, - "node_modules/appium-safari-driver/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-safari-driver/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", + "peer": true, "engines": { - "node": ">=12" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", + "peer": true, "dependencies": { - "ansi-regex": "^5.0.1" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/appium-safari-driver/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "extraneous": true, + "node_modules/appium-safari-driver/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -10902,234 +13301,236 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-safari-driver/node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "extraneous": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "license": "ISC", + "peer": true, "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">= 14" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">= 14" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "node_modules/appium-safari-driver/node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, + "peer": true, "engines": { - "node": ">= 14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC", + "peer": true }, - "node_modules/argparse": { + "node_modules/appium-safari-driver/node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT", + "optional": true, + "peer": true }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "node_modules/appium-safari-driver/node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", + "peer": true, "dependencies": { - "tslib": "^2.0.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "peer": true, "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=16" + "node": ">= 0.4" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC", + "peer": true }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "node_modules/appium-safari-driver/node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", - "optional": true + "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT", + "optional": true, + "peer": true }, - "node_modules/bare-fs": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz", - "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==", - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "optional": true, - "engines": { - "bare": ">=1.14.0" + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT", "optional": true, + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "peer": true, "dependencies": { - "bare-os": "^3.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "license": "Apache-2.0", - "optional": true, + "node_modules/appium-safari-driver/node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "peer": true, "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/appium-safari-driver/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -11144,346 +13545,333 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "BSD-3-Clause", + "peer": true }, - "node_modules/base64-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", - "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC", + "peer": true }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "node_modules/appium-safari-driver/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "node_modules/appium-safari-driver/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } + "peer": true }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "node_modules/appium-safari-driver/node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", + "peer": true, "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" + "hasown": "^2.0.2" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/appium-safari-driver/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/appium-safari-driver/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "peer": true, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "dev": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "license": "ISC", "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" + "lodash.isfinite": "^3.3.2" } }, - "node_modules/body-parser/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "peer": true }, - "node_modules/body-parser/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" + "peer": true, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/appium-safari-driver/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": ">=16" } }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/appium-safari-driver/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { - "side-channel": "^1.1.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=0.6" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/body-parser/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/jsftp": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", + "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", "license": "MIT", + "peer": true, "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" + "debug": "^3.1.0", + "ftp-response-parser": "^1.0.1", + "once": "^1.4.0", + "parse-listing": "^1.1.3", + "stream-combiner": "^0.2.2", + "unorm": "^1.4.1" }, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", + "node_modules/appium-safari-driver/node_modules/jsftp/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", + "peer": true, "dependencies": { - "stream-buffers": "2.2.x" + "ms": "^2.1.1" } }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "node_modules/appium-safari-driver/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } + "peer": true }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } + "node_modules/appium-safari-driver/node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)", + "peer": true }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "node_modules/appium-safari-driver/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "extraneous": true, + "license": "MIT" }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/appium-safari-driver/node_modules/klaw": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", + "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "peer": true, + "engines": { + "node": ">=14.14.0" } }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "node_modules/appium-safari-driver/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "node_modules/appium-safari-driver/node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", "license": "MIT", - "engines": { - "node": ">=0.10" - } + "peer": true }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "node_modules/appium-safari-driver/node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, "engines": { - "node": ">=0.2.0" + "node": ">= 0.6.3" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "peer": true }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", - "engines": { - "node": ">=14.16" + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", + "peer": true, "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" + "safe-buffer": "~5.1.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/appium-safari-driver/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/appium-safari-driver/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "peer": true, "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "node_modules/appium-safari-driver/node_modules/lockfile": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "license": "ISC", + "peer": true, + "dependencies": { + "signal-exit": "^3.0.2" + } + }, + "node_modules/appium-safari-driver/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "license": "MIT" + }, + "node_modules/appium-safari-driver/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { "node": ">=10" }, @@ -11491,515 +13879,453 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chai": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", - "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", + "peer": true, "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" }, "engines": { - "node": ">=18" + "node": ">= 12.0.0" } }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "license": "MIT/X11", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, + "node_modules/appium-safari-driver/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", "engines": { - "node": "*" + "node": "20 || >=22" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/appium-safari-driver/node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "peer": true, "engines": { - "node": ">= 16" + "node": ">= 0.8" } }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, + "peer": true, "engines": { - "node": ">= 14.16.0" + "node": ">=18" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chromium-bidi": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz", - "integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==", - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "license": "MIT", + "peer": true, "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0" + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" }, - "peerDependencies": { - "devtools-protocol": "*" + "engines": { + "node": ">= 0.10" } }, - "node_modules/cli-cursor": { + "node_modules/appium-safari-driver/node_modules/method-override/node_modules/debug": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", + "peer": true, "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" + "ms": "2.0.0" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "node_modules/appium-safari-driver/node_modules/method-override/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "peer": true }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, + "node_modules/appium-safari-driver/node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/appium-safari-driver/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/appium-safari-driver/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "mime-db": "^1.54.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/appium-safari-driver/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "peer": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", "engines": { - "node": ">=0.8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "node_modules/appium-safari-driver/node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, + "peer": true, "engines": { - "node": ">=12.5.0" + "node": "*" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/appium-safari-driver/node_modules/morgan": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", + "license": "MIT", + "peer": true, "dependencies": { - "color-name": "~1.1.4" + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.8.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "node_modules/appium-safari-driver/node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", + "peer": true, "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "ms": "2.0.0" } }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "node_modules/appium-safari-driver/node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } + "peer": true }, - "node_modules/colorspace/node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "node_modules/appium-safari-driver/node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", + "peer": true, "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/colorspace/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/appium-safari-driver/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/colorspace/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "peer": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/appium-safari-driver/node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "peer": true, + "bin": { + "ncp": "bin/ncp" } }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "node_modules/appium-safari-driver/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 6" + "node": ">= 0.6" } }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/node-simctl": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-8.0.6.tgz", + "integrity": "sha512-NsoaB+I/qPwfkyCUYWD03CEQwk07UQcs9YYXp8++qQCBFazLabY1tSQXXapGx4r72BStQtS14rJr4qt3VEE5Lg==", + "license": "Apache-2.0", "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" + "@appium/logger": "^2.0.0-rc.1", + "asyncbox": "^3.0.0", + "bluebird": "^3.5.1", + "lodash": "^4.2.1", + "rimraf": "^6.0.1", + "semver": "^7.0.0", + "source-map-support": "^0.x", + "teen_process": "^3.0.0", + "uuid": "^13.0.0", + "which": "^5.0.0" }, "engines": { - "node": ">= 14" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "dev": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", + "peer": true, "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node_modules/appium-safari-driver/node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "node_modules/appium-safari-driver/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", + "peer": true, "engines": { - "node": ">=6.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT", + "optional": true, + "peer": true }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" + "node_modules/appium-safari-driver/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" }, "engines": { - "node": ">=0.8" + "node": ">= 0.8" } }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "node_modules/appium-safari-driver/node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, + "peer": true, "engines": { - "node": ">= 14" + "node": ">= 0.8" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "peer": true, + "dependencies": { + "wrappy": "1" + } }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "node_modules/appium-safari-driver/node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", + "peer": true, "dependencies": { - "node-fetch": "^2.6.12" + "fn.name": "1.x.x" } }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/appium-safari-driver/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", + "peer": true, "dependencies": { - "whatwg-url": "^5.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": ">=6" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/appium-safari-driver/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", + "peer": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "node": ">=10" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/css-shorthand-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.2.tgz", - "integrity": "sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==", - "license": "MIT" - }, - "node_modules/css-value": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", - "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==" - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "node_modules/appium-safari-driver/node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 12" + "node": ">=8" } }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "node_modules/appium-safari-driver/node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { - "ms": "^2.1.3" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "node_modules/appium-safari-driver/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/appium-safari-driver/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", + "peer": true, "dependencies": { - "mimic-response": "^3.1.0" + "p-limit": "^3.0.2" }, "engines": { "node": ">=10" @@ -12008,617 +14334,680 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/appium-safari-driver/node_modules/package-changed": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", + "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", + "license": "ISC", + "peer": true, + "dependencies": { + "commander": "^6.2.0" + }, + "bin": { + "package-changed": "bin/package-changed.js" + } + }, + "node_modules/appium-safari-driver/node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/appium-safari-driver/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/appium-safari-driver/node_modules/parse-listing": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", + "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", + "peer": true, + "engines": { + "node": ">=0.6.21" } }, - "node_modules/deepmerge-ts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", - "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", - "license": "BSD-3-Clause", + "node_modules/appium-safari-driver/node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=16.0.0" + "node": ">= 0.8" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/appium-safari-driver/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/appium-safari-driver/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", + "peer": true, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/appium-safari-driver/node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">= 14" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/appium-safari-driver/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "engines": { - "node": ">=0.4.0" + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/appium-safari-driver/node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "license": "MIT", + "peer": true, + "dependencies": { + "find-up": "^5.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/appium-safari-driver/node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "license": "MIT", + "peer": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=10.4.0" } }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "node_modules/appium-safari-driver/node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", "license": "MIT", - "optional": true - }, - "node_modules/devtools-protocol": { - "version": "0.0.1400418", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1400418.tgz", - "integrity": "sha512-U8j75zDOXF8IP3o0Cgb7K4tFA9uUHEOru2Wx64+EUqL4LNOh9dRe1i8WKR1k3mSpjcCe3aIkTDvEwq0YkI4hfw==", - "license": "BSD-3-Clause" - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "license": "BSD-3-Clause", + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, "engines": { - "node": ">=0.3.1" + "node": ">=0.4", + "npm": ">=1.0.0" } }, - "node_modules/doc-detective-common": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.1.1.tgz", - "integrity": "sha512-Ldq9Es3f2dTYgSwIK+rHSXYMsmuDJBmYYdtvRKD3QimY2uSoI7O58koygIp6A3Jgud9EmvsyFE7R1gJt0FAtMA==", - "license": "AGPL-3.0-only", + "node_modules/appium-safari-driver/node_modules/portscanner/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "license": "MIT", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.0.2", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.10.0", - "uuid": "^11.1.0", - "yaml": "^2.8.0" + "lodash": "^4.17.14" } }, - "node_modules/doc-detective-common/node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "node_modules/appium-safari-driver/node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "peer": true, + "engines": { + "node": ">= 0.6.0" } }, - "node_modules/doc-detective-core": { - "version": "3.1.3-dev.1", - "resolved": "https://registry.npmjs.org/doc-detective-core/-/doc-detective-core-3.1.3-dev.1.tgz", - "integrity": "sha512-R8VbWXFEidEmi6xYwRPc0R/xwce3CKDiR+l3Zlt4i1ogwASYemmLEJueNkeNLYrPbx3401OZQvzugIrAqDZk+w==", - "hasInstallScript": true, - "license": "AGPL-3.0-only", + "node_modules/appium-safari-driver/node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "peer": true, "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.1.1", - "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@puppeteer/browsers": "^2.10.6", - "ajv": "^8.17.1", - "appium": "^2.19.0", - "appium-chromium-driver": "1.5.1", - "appium-geckodriver": "^1.4.3", - "appium-safari-driver": "^3.5.25", - "axios": "^1.10.0", - "doc-detective-common": "^3.1.1", - "doc-detective-resolver": "^3.1.2-dev.3", - "dotenv": "^17.2.0", - "geckodriver": "^5.0.0", - "jq-web": "^0.6.2", - "json-schema-faker": "^0.5.9", - "pixelmatch": "^5.3.0", - "pngjs": "^7.0.0", - "posthog-node": "^5.5.1", - "sharp": "^0.34.3", - "tree-kill": "^1.2.2", - "uuid": "^11.1.0", - "webdriverio": "8.45.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, - "optionalDependencies": { - "@ffmpeg-installer/darwin-arm64": "4.1.5", - "@ffmpeg-installer/darwin-x64": "4.1.0", - "@ffmpeg-installer/linux-arm": "4.1.3", - "@ffmpeg-installer/linux-arm64": "4.1.4", - "@ffmpeg-installer/linux-ia32": "4.1.0", - "@ffmpeg-installer/linux-x64": "4.1.0", - "@ffmpeg-installer/win32-ia32": "4.1.0", - "@ffmpeg-installer/win32-x64": "4.1.0", - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.6", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-ppc64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.6", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/doc-detective-core/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">= 0.10" } }, - "node_modules/doc-detective-core/node_modules/@img/sharp-win32-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", - "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/appium-safari-driver/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=0.6" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/doc-detective-core/node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "node_modules/appium-safari-driver/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-safari-driver/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", + "peer": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/doc-detective-core/node_modules/sharp": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", - "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", - "hasInstallScript": true, - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "peer": true, "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=0.10.0" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.3", - "@img/sharp-darwin-x64": "0.34.3", - "@img/sharp-libvips-darwin-arm64": "1.2.0", - "@img/sharp-libvips-darwin-x64": "1.2.0", - "@img/sharp-libvips-linux-arm": "1.2.0", - "@img/sharp-libvips-linux-arm64": "1.2.0", - "@img/sharp-libvips-linux-ppc64": "1.2.0", - "@img/sharp-libvips-linux-s390x": "1.2.0", - "@img/sharp-libvips-linux-x64": "1.2.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", - "@img/sharp-libvips-linuxmusl-x64": "1.2.0", - "@img/sharp-linux-arm": "0.34.3", - "@img/sharp-linux-arm64": "0.34.3", - "@img/sharp-linux-ppc64": "0.34.3", - "@img/sharp-linux-s390x": "0.34.3", - "@img/sharp-linux-x64": "0.34.3", - "@img/sharp-linuxmusl-arm64": "0.34.3", - "@img/sharp-linuxmusl-x64": "0.34.3", - "@img/sharp-wasm32": "0.34.3", - "@img/sharp-win32-arm64": "0.34.3", - "@img/sharp-win32-ia32": "0.34.3", - "@img/sharp-win32-x64": "0.34.3" - } - }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", - "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/appium-safari-driver/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.0" + "engines": { + "node": ">=8" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-darwin-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", - "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/appium-safari-driver/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.0" + "node": ">=8" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", - "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-safari-driver/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", - "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" + "node_modules/appium-safari-driver/node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", - "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-safari-driver/node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", - "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-safari-driver/node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", - "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-safari-driver/node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", - "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-safari-driver/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "extraneous": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", - "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/appium-safari-driver/node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", - "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-safari-driver/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", - "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/appium-safari-driver/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "peer": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linux-arm": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", - "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/appium-safari-driver/node_modules/rimraf": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", + "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.0", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "20 || >=22" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.0" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linux-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", - "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/appium-safari-driver/node_modules/rimraf/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "20 || >=22" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.0" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linux-s390x": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", - "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/appium-safari-driver/node_modules/rimraf/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "20 || >=22" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/appium-safari-driver/node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.0" + "engines": { + "node": ">= 18" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linux-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", - "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/appium-safari-driver/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "peer": true, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.0" + "node": ">=10" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", - "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", + "node_modules/appium-safari-driver/node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "license": "WTFPL OR ISC", + "peer": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/appium-safari-driver/node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=10" + } + }, + "node_modules/appium-safari-driver/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">= 18" + } + }, + "node_modules/appium-safari-driver/node_modules/serve-favicon": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", + "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "etag": "~1.8.1", + "fresh": "~0.5.2", + "ms": "~2.1.3", + "parseurl": "~1.3.2", + "safe-buffer": "~5.2.1" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", - "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", - "cpu": [ - "x64" + "node_modules/appium-safari-driver/node_modules/serve-favicon/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/appium-safari-driver/node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/appium-safari-driver/node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/appium-safari-driver/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, "license": "Apache-2.0", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -12626,558 +15015,597 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.0" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-wasm32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", - "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, + "node_modules/appium-safari-driver/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "peer": true, "dependencies": { - "@emnapi/runtime": "^1.4.4" + "shebang-regex": "^3.0.0" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">=8" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-win32-ia32": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", - "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/appium-safari-driver/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "peer": true, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">=8" } }, - "node_modules/doc-detective-core/node_modules/sharp/node_modules/@img/sharp-win32-x64": { - "version": "0.34.3", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", - "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "node_modules/appium-safari-driver/node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/doc-detective-resolver": { - "version": "3.1.2-dev.3", - "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.1.2-dev.3.tgz", - "integrity": "sha512-HmNW2jieZ6ozW9Bw4qIQL5W2cQlBx70vMnXgenfaht+q5r+7U/8X49L/7ajUVpMh6SsMTsAsXMlLX7cDQqSadA==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.0.3", - "ajv": "^8.17.1", - "axios": "^1.10.0", - "doc-detective-common": "^3.1.2-dev.2", - "dotenv": "^17.0.1", - "json-schema-faker": "^0.5.9", - "posthog-node": "^5.1.1", - "uuid": "^11.1.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/doc-detective-resolver/node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "node_modules/appium-safari-driver/node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", + "peer": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/doc-detective-resolver/node_modules/doc-detective-common": { - "version": "3.1.2-dev.2", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.1.2-dev.2.tgz", - "integrity": "sha512-79vJgLsKTW1uEega9i/N/teu1dhnCT469gs0Nyoew4mnwf10I1DT+qt3qu9CRkGEFa7nH0Hfdk/XWUHqZqXY1w==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.0.3", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.10.0", - "uuid": "^11.1.0", - "yaml": "^2.8.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotenv": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.0.tgz", - "integrity": "sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==", - "license": "BSD-2-Clause", + "node_modules/appium-safari-driver/node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "peer": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dunder-proto": { + "node_modules/appium-safari-driver/node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", + "peer": true, "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/appium-safari-driver/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "peer": true }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "node_modules/appium-safari-driver/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/appium-safari-driver/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "safe-buffer": "~5.1.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "node_modules/appium-safari-driver/node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0", + "peer": true }, - "node_modules/edge-paths": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", - "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", + "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", + "peer": true, "dependencies": { - "@types/which": "^2.0.1", - "which": "^2.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/shirshak55" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/edge-paths/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "node_modules/appium-safari-driver/node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "license": "CC0-1.0", + "peer": true }, - "node_modules/edge-paths/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=6.0.0" } }, - "node_modules/edgedriver": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.1.tgz", - "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", - "hasInstallScript": true, + "node_modules/appium-safari-driver/node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@wdio/logger": "^8.38.0", - "@zip.js/zip.js": "^2.7.48", - "decamelize": "^6.0.0", - "edge-paths": "^3.0.5", - "fast-xml-parser": "^4.4.1", - "node-fetch": "^3.3.2", - "which": "^4.0.0" - }, - "bin": { - "edgedriver": "bin/edgedriver.js" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "node_modules/edgedriver/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "node_modules/appium-safari-driver/node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^16.13 || >=18" + "node": ">= 6" } }, - "node_modules/edgedriver/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/appium-safari-driver/node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", + "peer": true, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "*" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/appium-safari-driver/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" + "node_modules/appium-safari-driver/node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "license": "Unlicense", + "peer": true, + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/appium-safari-driver/node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", "license": "MIT", + "peer": true, "dependencies": { - "is-arrayish": "^0.2.1" + "duplexer": "~0.1.1", + "through": "~2.3.4" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/appium-safari-driver/node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "peer": true, + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" } }, - "node_modules/es-errors": { + "node_modules/appium-safari-driver/node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/appium-safari-driver/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", + "peer": true, "dependencies": { - "es-errors": "^1.3.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/appium-safari-driver/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "peer": true, "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "peer": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" + "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT", + "peer": true }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", + "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "peer": true, "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=8" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/appium-safari-driver/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/appium-safari-driver/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/event-target-shim": { + "node_modules/appium-safari-driver/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">=0.8.x" + "node": ">=8" } }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "peer": true, "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 18" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/express/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "peer": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/teen_process": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.3.tgz", + "integrity": "sha512-pYAojbLkaqXHpgze5AEdchW71OKownDPpqYpLTQsU/pUGMv3zr4yo2mSv/NnRAkRmsrNF2BP9byh2MVk9Y5H9A==", + "license": "Apache-2.0", "dependencies": { - "mime-db": "^1.54.0" + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" }, "engines": { - "node": ">= 0.6" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, - "node_modules/express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/appium-safari-driver/node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "side-channel": "^1.1.0" - }, + "b4a": "^1.6.4" + } + }, + "node_modules/appium-safari-driver/node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "peer": true, "engines": { "node": ">=0.6" + } + }, + "node_modules/appium-safari-driver/node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/appium-safari-driver/node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "license": "WTFPL", + "peer": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/appium-safari-driver/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true, + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/type-fest": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", + "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", + "license": "(MIT OR CC0-1.0)", + "peer": true, + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express/node_modules/type-is": { + "node_modules/appium-safari-driver/node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, "license": "MIT", + "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -13187,768 +15615,712 @@ "node": ">= 0.6" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, + "node_modules/appium-safari-driver/node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "license": "MIT or GPL-2.0", + "peer": true, "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "node": ">= 0.4.0" } }, - "node_modules/extract-zip/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "node_modules/appium-safari-driver/node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", + "peer": true, "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/appium-safari-driver/node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "license": "(WTFPL OR MIT)", + "peer": true }, - "node_modules/extract-zip/node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "node_modules/appium-safari-driver/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "peer": true }, - "node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "node_modules/appium-safari-driver/node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], "license": "MIT", - "dependencies": { - "strnum": "^1.1.1" - }, "bin": { - "fxparser": "src/cli/cli.js" + "uuid": "dist-node/bin/uuid" } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "node_modules/appium-safari-driver/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/appium-safari-driver/node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 4.9.1" + "node": ">= 0.8" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/appium-safari-driver/node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "pend": "~1.2.0" + "minimalistic-assert": "^1.0.0" } }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], + "node_modules/appium-safari-driver/node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", + "peer": true, "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" + "defaults": "^1.0.3" } }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "dev": true, - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "license": "ISC", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { - "node": ">= 0.8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/appium-safari-driver/node_modules/winston": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", + "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", + "license": "MIT", + "peer": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" + "node": ">= 12.0.0" } }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/appium-safari-driver/node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "engines": { - "node": ">=4.0" + "peer": true, + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "engines": { + "node": ">= 12.0.0" } }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "node_modules/appium-safari-driver/node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "peer": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 6" } }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "node_modules/appium-safari-driver/node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "node_modules/appium-safari-driver/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">= 14.17" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "license": "MIT" - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", + "peer": true, "dependencies": { - "fetch-blob": "^3.1.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12.20.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "peer": true }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.6" + "node": ">=8" } }, - "node_modules/ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", + "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "peer": true, "dependencies": { - "readable-stream": "^1.0.31" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/ftp-response-parser/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/ftp-response-parser/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "peer": true, + "engines": { + "node": ">=8" } }, - "node_modules/ftp-response-parser/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "peer": true }, - "node_modules/geckodriver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-5.0.0.tgz", - "integrity": "sha512-vn7TtQ3b9VMJtVXsyWtQQl1fyBVFhQy7UvJF96kPuuJ0or5THH496AD3eUyaDD11+EqCxH9t6V+EP9soZQk4YQ==", - "hasInstallScript": true, + "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "peer": true, "dependencies": { - "@wdio/logger": "^9.1.3", - "@zip.js/zip.js": "^2.7.53", - "decamelize": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^3.3.2", - "tar-fs": "^3.0.6", - "which": "^5.0.0" - }, - "bin": { - "geckodriver": "bin/geckodriver.js" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, - "node_modules/geckodriver/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "license": "ISC", + "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "peer": true, "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=8" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } + "node_modules/appium-safari-driver/node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC", + "peer": true }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, + "node_modules/appium-safari-driver/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "peer": true, "engines": { - "node": "*" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/appium-safari-driver/node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, + "peer": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0" } }, - "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", - "license": "MIT", + "node_modules/appium-safari-driver/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "peer": true, "engines": { - "node": ">=16" + "node": ">=10" + } + }, + "node_modules/appium-safari-driver/node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "license": "ISC", + "peer": true, + "bin": { + "yaml": "bin.mjs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 14.6" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/appium-safari-driver/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", + "peer": true, "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/appium-safari-driver/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/appium-safari-driver/node_modules/yargs/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT", + "peer": true + }, + "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", + "peer": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "node_modules/appium-safari-driver/node_modules/yauzl": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "license": "MIT", + "peer": true, "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" }, "engines": { - "node": ">= 14" + "node": ">=12" } }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "node_modules/appium-safari-driver/node_modules/yauzl/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 14" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/appium-safari-driver/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "node_modules/appium-safari-driver/node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "license": "MIT", + "peer": true, "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">= 14" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "license": "MIT" - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT", - "optional": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/appium/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 14" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "tslib": "^2.0.1" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" + "node": ">=4" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "license": "MIT" }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "optional": true, + "node_modules/asyncbox": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", + "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", + "license": "Apache-2.0", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "bluebird": "^3.5.1", + "lodash": "^4.17.4", + "source-map-support": "^0.x" + }, + "engines": { + "node": ">=16" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", "license": "MIT", - "optional": true + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", - "optional": true, "dependencies": { - "safe-buffer": "~5.1.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" } }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT", - "optional": true + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" }, - "engines": { - "node": ">= 0.8" + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", + "node_modules/bare-fs": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.1.tgz", + "integrity": "sha512-zGUCsm3yv/ePt2PHNbVxjjn0nNB1MkIaR4wOCxJ2ig5pCf5cCVAYJXVhQg/3OhhJV6DB1ts7Hv0oUaElc2TPQg==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { - "node": ">= 14" + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } } }, - "node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" + "bare-os": "^3.0.1" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "streamx": "^2.21.0" }, - "engines": { - "node": ">= 14" + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", + "node_modules/bare-url": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "license": "Apache-2.0", + "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "bare-path": "^3.0.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -13963,1720 +16335,1665 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "MIT" }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "node_modules/base64-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", + "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", "license": "MIT" }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { - "node": ">= 12" + "node": ">=10.0.0" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", "engines": { - "node": ">= 0.10" + "node": ">=0.6" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 6" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "license": "MIT" }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/isarray": { + "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" }, - "node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" + "node_modules/bplist-creator": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", + "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "big-integer": "1.6.x" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">= 5.10.0" } }, - "node_modules/jq-web": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/jq-web/-/jq-web-0.6.2.tgz", - "integrity": "sha512-+7XvjBYwTx4vP5PYkf6Q6orubO/v+UgMU6By1GritrmShr9QpT3UKa4ANzXWQfhdqtBnQYXsm7ZNbdIHT6tYpQ==", - "license": "ISC" + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, - "node_modules/jsep": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", - "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { - "node": ">= 10.16.0" + "node": ">= 0.8" } }, - "node_modules/jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "debug": "^3.1.0", - "ftp-response-parser": "^1.0.1", - "once": "^1.4.0", - "parse-listing": "^1.1.3", - "stream-combiner": "^0.2.2", - "unorm": "^1.4.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/jsftp/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "license": "MIT" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/json-schema-faker": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", - "integrity": "sha512-fNKLHgDvfGNNTX1zqIjqFMJjCLzJ2kvnJ831x4aqkAoeE4jE2TxvpJdhOnk3JU3s42vFzmXvkpbYzH5H3ncAzg==", + "node_modules/chai": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", + "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "dev": true, "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "json-schema-ref-parser": "^6.1.0", - "jsonpath-plus": "^10.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "bin": { - "jsf": "bin/gen.cjs" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "license": "MIT", + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/json-schema-ref-parser/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "readdirp": "^4.0.1" }, "engines": { - "node": ">=6" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/jsonpath-plus": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", - "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "license": "MIT", - "dependencies": { - "@jsep-plugin/assignment": "^1.3.0", - "@jsep-plugin/regex": "^1.0.4", - "jsep": "^1.4.0" - }, - "bin": { - "jsonpath": "bin/jsonpath-cli.js", - "jsonpath-plus": "bin/jsonpath-cli.js" - }, "engines": { - "node": ">=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/klaw": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", - "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", - "license": "MIT", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=14.14.0" + "node": ">=12" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/ky": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", - "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "engines": { - "node": ">=14.16" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "readable-stream": "^2.0.5" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.6.3" + "node": ">=8" } }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": ">=0.8" } }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", "dependencies": { - "immediate": "~3.0.5" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "license": "ISC" + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/locate-app": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", - "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "Apache-2.0", + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", "dependencies": { - "@promptbook/utils": "0.69.5", - "type-fest": "4.26.0", - "userhome": "1.0.1" + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/locate-app/node_modules/type-fest": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", - "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", - "license": "(MIT OR CC0-1.0)", + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.20" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "color-name": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" + "node": ">=14.6" } }, - "node_modules/lockfile/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "license": "MIT" - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, + "node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.20" } }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 0.8" } }, - "node_modules/loglevel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "node": ">= 6" } }, - "node_modules/loglevel-plugin-prefix": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", - "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "license": "MIT", "dependencies": { - "get-func-name": "^2.0.1" + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC" }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { "node": ">= 0.6" } }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.10" + "node": ">= 0.6" } }, - "node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=6.6.0" } }, - "node_modules/method-override/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", "bin": { - "mime": "cli.js" + "crc32": "bin/crc32.njs" }, "engines": { - "node": ">=4" + "node": ">=0.8" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">= 14" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 8" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC", - "optional": true + "node_modules/css-shorthand-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.2.tgz", + "integrity": "sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==", + "license": "MIT" }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==" + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "node": ">= 14" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, - "node_modules/mocha": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.1.tgz", - "integrity": "sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==", - "dev": true, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { - "browser-stdout": "^1.3.1", - "chokidar": "^4.0.1", - "debug": "^4.3.5", - "diff": "^7.0.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^10.4.5", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^9.0.5", - "ms": "^2.1.3", - "picocolors": "^1.1.1", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^9.2.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "ms": "^2.1.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, + "node_modules/decamelize": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.1.tgz", + "integrity": "sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==", + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "license": "BSD-3-Clause", "engines": { - "node": "*" + "node": ">=16.0.0" } }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" + "clone": "^1.0.2" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, "engines": { "node": ">= 0.8" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "license": "MIT", - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } + "optional": true }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.6" + "node": ">=0.3.1" } }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "node_modules/doc-detective-common": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.5.1.tgz", + "integrity": "sha512-EL52Vk5HXl5BNlr0GpJrxcQTZ3TOn9CNYfrT/WlBH9f+PJ80HnXfSpQpcJuw+Rn5S7OEi0empzoaNGUY4PZxXw==", + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^15.1.2", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "yaml": "^2.8.1" + } + }, + "node_modules/doc-detective-core": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/doc-detective-core/-/doc-detective-core-3.5.1.tgz", + "integrity": "sha512-kAWLRYOTM6PAvtE6ShwSe1yXONu85yUEdYDnP572F4X6mkyDzWWa9maCFmEv7BDDZdsksWTzCgWQnddwMtT2mA==", + "hasInstallScript": true, + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^15.1.2", + "@ffmpeg-installer/ffmpeg": "^1.1.0", + "@puppeteer/browsers": "^2.10.13", + "ajv": "^8.17.1", + "appium": "^3.1.1", + "appium-chromium-driver": "^2.0.3", + "appium-geckodriver": "^2.1.1", + "appium-safari-driver": "^4.1.0", + "axios": "^1.13.2", + "doc-detective-common": "^3.5.1", + "doc-detective-resolver": "^3.5.2", + "dotenv": "^17.2.3", + "geckodriver": "^6.1.0", + "jq-web": "^0.6.2", + "json-schema-faker": "^0.5.9", + "pixelmatch": "^5.3.0", + "pngjs": "^7.0.0", + "posthog-node": "^5.14.0", + "tree-kill": "^1.2.2", + "webdriverio": "^9.20.1" + }, + "optionalDependencies": { + "@ffmpeg-installer/darwin-arm64": "4.1.5", + "@ffmpeg-installer/darwin-x64": "4.1.0", + "@ffmpeg-installer/linux-arm": "4.1.3", + "@ffmpeg-installer/linux-arm64": "4.1.4", + "@ffmpeg-installer/linux-ia32": "4.1.0", + "@ffmpeg-installer/linux-x64": "4.1.0", + "@ffmpeg-installer/win32-ia32": "4.1.0", + "@ffmpeg-installer/win32-x64": "4.1.0", + "@img/sharp-darwin-arm64": "^0.34.5", + "@img/sharp-darwin-x64": "^0.34.5", + "@img/sharp-libvips-darwin-arm64": "^1.2.4", + "@img/sharp-libvips-darwin-x64": "^1.2.4", + "@img/sharp-libvips-linux-arm": "^1.2.4", + "@img/sharp-libvips-linux-arm64": "^1.2.4", + "@img/sharp-libvips-linux-ppc64": "^1.2.4", + "@img/sharp-libvips-linux-riscv64": "^1.2.4", + "@img/sharp-libvips-linux-s390x": "^1.2.4", + "@img/sharp-libvips-linux-x64": "^1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "^1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "^1.2.4", + "@img/sharp-linux-arm": "^0.34.5", + "@img/sharp-linux-arm64": "^0.34.5", + "@img/sharp-linux-ppc64": "^0.34.5", + "@img/sharp-linux-riscv64": "^0.34.5", + "@img/sharp-linux-s390x": "^0.34.5", + "@img/sharp-linux-x64": "^0.34.5", + "@img/sharp-linuxmusl-arm64": "^0.34.5", + "@img/sharp-linuxmusl-x64": "^0.34.5", + "@img/sharp-wasm32": "^0.34.5", + "@img/sharp-win32-arm64": "^0.34.5", + "@img/sharp-win32-ia32": "^0.34.5", + "@img/sharp-win32-x64": "^0.34.5" + } + }, + "node_modules/doc-detective-resolver": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.5.2.tgz", + "integrity": "sha512-7lSoAsgSDuMRjd8QpEiOlcsEU3/xY4bXfd9HDKAGek0Rsjwf7wcBSW2h/kGAWbhkfj1GPzHVlig4tZsoc9L5DQ==", + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^15.1.2", + "ajv": "^8.17.1", + "axios": "^1.13.2", + "doc-detective-common": "^3.5.1", + "dotenv": "^17.2.3", + "json-schema-faker": "^0.5.9", + "posthog-node": "^5.14.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", - "engines": { - "node": ">= 0.4.0" + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" + "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } + "license": "BSD-2-Clause" }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "domelementtype": "^2.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/normalize-url": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", - "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", - "license": "MIT", + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "license": "BSD-2-Clause", "engines": { - "node": ">=14.16" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://dotenvx.com" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT", - "optional": true + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/edge-paths": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", + "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "@types/which": "^2.0.1", + "which": "^2.0.2" }, "engines": { - "node": ">= 0.8" + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/shirshak55" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "node_modules/edge-paths/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/edge-paths/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=6" + "bin": { + "node-which": "bin/node-which" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 8" } }, - "node_modules/ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", + "node_modules/edgedriver": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-6.2.0.tgz", + "integrity": "sha512-49G6010o0VYXUMNi5OvxqE9O/kazs0qmJVqHcSHNvp1VfojO21Kb/NaJN40uy11yrlGHRp7y6a372xoCnShzlA==", + "hasInstallScript": true, "license": "MIT", "dependencies": { - "format-util": "^1.0.3" + "@wdio/logger": "^9.18.0", + "@zip.js/zip.js": "^2.8.11", + "decamelize": "^6.0.1", + "edge-paths": "^3.0.5", + "fast-xml-parser": "^5.3.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "which": "^6.0.0" + }, + "bin": { + "edgedriver": "bin/edgedriver.js" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", + "node_modules/edgedriver/node_modules/which": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", + "license": "ISC", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "isexe": "^3.1.1" }, - "engines": { - "node": ">=10" + "bin": { + "node-which": "bin/which.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", - "engines": { - "node": ">=12.20" + "dependencies": { + "once": "^1.4.0" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { - "node": ">=10" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" + "is-arrayish": "^0.2.1" } }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, "engines": { - "node": ">= 14" + "node": ">= 0.4" } }, - "node_modules/package-changed": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", - "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", - "license": "ISC", - "dependencies": { - "commander": "^6.2.0" - }, - "bin": { - "package-changed": "bin/package-changed.js" + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/parse-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">=0.6.21" + "node": ">= 0.4" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/es-toolkit": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.42.0.tgz", + "integrity": "sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==", "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "workspaces": [ + "docs", + "benchmarks" + ] }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" }, - "engines": { - "node": ">=16 || 14 >=14.18" + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", "engines": { - "node": ">=16" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">= 14.16" + "node": ">=4" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/pixelmatch": { + "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", - "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", - "dependencies": { - "pngjs": "^6.0.0" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "node_modules/pixelmatch/node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { - "node": ">=12.13.0" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, "engines": { - "node": ">=10.4.0" + "node": ">=6" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.8.x" } }, - "node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "engines": { - "node": ">=14.19.0" + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" } }, - "node_modules/posthog-node": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.5.1.tgz", - "integrity": "sha512-y2TBl6H27vEbXk7sqG8QISmYaUN/UcPOYYDAK0wtnXRG3ySb93mG//vri1zS2hZvYHbBv0Tz8sLpZRCq4/v99A==", + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, "engines": { - "node": ">=20" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">= 0.8" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">= 0.6" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.6" } }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" }, "engines": { - "node": ">= 14" + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", + "node_modules/extract-zip/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/puppeteer-core": { - "version": "21.11.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.11.0.tgz", - "integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==", - "license": "Apache-2.0", + "node_modules/extract-zip/node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", "dependencies": { - "@puppeteer/browsers": "1.9.1", - "chromium-bidi": "0.5.8", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1232444", - "ws": "8.16.0" - }, - "engines": { - "node": ">=16.13.2" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, - "node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", - "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", - "license": "Apache-2.0", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-parser": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.2.tgz", + "integrity": "sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.1", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" + "strnum": "^2.1.0" }, "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" + "fxparser": "src/cli/cli.js" } }, - "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 4.9.1" } }, - "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1232444", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz", - "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==", - "license": "BSD-3-Clause" - }, - "node_modules/puppeteer-core/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" } }, - "node_modules/puppeteer-core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "license": "MIT" }, - "node_modules/puppeteer-core/node_modules/proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" }, "engines": { - "node": ">= 14" + "node": "^12.20 || >= 14.13" } }, - "node_modules/puppeteer-core/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", "license": "MIT", "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "license": "MIT", "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "node": ">=18" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/query-selector-shadow-dom": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", - "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=10" }, @@ -15684,954 +18001,2837 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "bin": { + "flat": "cli.js" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "dev": true, - "license": "MIT", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } + "node_modules/format-util": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", + "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", + "license": "MIT" }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12.20.0" } }, - "node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", + "node_modules/ftp-response-parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", + "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", "dependencies": { - "brace-expansion": "^2.0.1" + "readable-stream": "^1.0.31" }, "engines": { - "node": ">=10" + "node": ">=0.8.0" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, + "node_modules/ftp-response-parser/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "node_modules/ftp-response-parser/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/geckodriver": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-6.1.0.tgz", + "integrity": "sha512-ZRXLa4ZaYTTgUO4Eefw+RsQCleugU2QLb1ME7qTYxxuRj51yAhfnXaItXNs5/vUzfIaDHuZ+YnSF005hfp07nQ==", + "hasInstallScript": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@wdio/logger": "^9.18.0", + "@zip.js/zip.js": "^2.8.11", + "decamelize": "^6.0.1", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "modern-tar": "^0.7.2" }, "bin": { - "resolve": "bin/resolve" + "geckodriver": "bin/geckodriver.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=20.0.0" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", - "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", + "node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^2.0.1" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resq/node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", - "license": "MIT" - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/rgb2hex": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", - "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^6.0.1" + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" }, - "bin": { - "rimraf": "bin.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "bin": { + "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "dev": true, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, "engines": { - "node": ">= 18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safaridriver": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", - "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", - "license": "MIT" + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "license": "MIT" }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", + "optional": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", - "optional": true - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 18" + "node": ">= 0.4" } }, - "node_modules/send/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", - "engines": { - "node": ">= 0.8" + "optional": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "optional": true + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT", + "optional": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", + "optional": true, "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" + "safe-buffer": "~5.1.0" } }, - "node_modules/serialize-error": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", - "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "node_modules/htmlfy": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.8.1.tgz", + "integrity": "sha512-xWROBw9+MEGwxpotll0h672KCaLrKKiCYzsyN8ZgL9cQbVumFnyvsk2JqiB9ELAV1GLj1GG/jxZUjV9OZZi/yQ==", + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "license": "MIT", "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" } }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", "engines": { - "node": ">=12.20" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT", + "optional": true + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", "dependencies": { - "randombytes": "^2.1.0" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/serve-favicon": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "license": "MIT", "dependencies": { - "etag": "~1.8.1", - "fresh": "0.5.2", - "ms": "2.1.1", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.1" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 14" } }, - "node_modules/serve-favicon/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", "license": "MIT" }, - "node_modules/serve-favicon/node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "license": "MIT" + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "dev": true, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 18" + "node": ">=0.10.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/sharp": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", - "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" - }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ink": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-6.5.1.tgz", + "integrity": "sha512-wF3j/DmkM8q5E+OtfdQhCRw8/0ahkc8CUTgEddxZzpEWPslu7YPL3t64MWRoI9m6upVGpfAg4ms2BBvxCdKRLQ==", + "license": "MIT", + "dependencies": { + "@alcalzone/ansi-tokenize": "^0.2.1", + "ansi-escapes": "^7.2.0", + "ansi-styles": "^6.2.1", + "auto-bind": "^5.0.1", + "chalk": "^5.6.0", + "cli-boxes": "^3.0.0", + "cli-cursor": "^4.0.0", + "cli-truncate": "^5.1.1", + "code-excerpt": "^4.0.0", + "es-toolkit": "^1.39.10", + "indent-string": "^5.0.0", + "is-in-ci": "^2.0.0", + "patch-console": "^2.0.0", + "react-reconciler": "^0.33.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^7.1.0", + "stack-utils": "^2.0.6", + "string-width": "^8.1.0", + "type-fest": "^4.27.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0", + "ws": "^8.18.0", + "yoga-layout": "~3.2.1" }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.2", - "@img/sharp-darwin-x64": "0.34.2", - "@img/sharp-libvips-darwin-arm64": "1.1.0", - "@img/sharp-libvips-darwin-x64": "1.1.0", - "@img/sharp-libvips-linux-arm": "1.1.0", - "@img/sharp-libvips-linux-arm64": "1.1.0", - "@img/sharp-libvips-linux-ppc64": "1.1.0", - "@img/sharp-libvips-linux-s390x": "1.1.0", - "@img/sharp-libvips-linux-x64": "1.1.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.2", - "@img/sharp-linux-arm64": "0.34.2", - "@img/sharp-linux-s390x": "0.34.2", - "@img/sharp-linux-x64": "0.34.2", - "@img/sharp-linuxmusl-arm64": "0.34.2", - "@img/sharp-linuxmusl-x64": "0.34.2", - "@img/sharp-wasm32": "0.34.2", - "@img/sharp-win32-arm64": "0.34.2", - "@img/sharp-win32-ia32": "0.34.2", - "@img/sharp-win32-x64": "0.34.2" - } - }, - "node_modules/sharp/node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", - "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "@types/react": ">=19.0.0", + "react": ">=19.0.0", + "react-devtools-core": "^6.1.2" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.1.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } } }, - "node_modules/sharp/node_modules/@img/sharp-darwin-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", - "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/ink-select-input": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ink-select-input/-/ink-select-input-6.2.0.tgz", + "integrity": "sha512-304fZXxkpYxJ9si5lxRCaX01GNlmPBgOZumXXRnPYbHW/iI31cgQynqk2tRypGLOF1cMIwPUzL2LSm6q4I5rQQ==", + "license": "MIT", + "dependencies": { + "figures": "^6.1.0", + "to-rotated": "^1.0.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "ink": ">=5.0.0", + "react": ">=18.0.0" + } + }, + "node_modules/ink-spinner": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-5.0.0.tgz", + "integrity": "sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA==", + "license": "MIT", + "dependencies": { + "cli-spinners": "^2.7.0" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.1.0" + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "ink": ">=4.0.0", + "react": ">=18.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/ink/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/ink/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/ink/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/ink/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ink/node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-in-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz", + "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==", + "license": "MIT", + "bin": { + "is-in-ci": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jq-web": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/jq-web/-/jq-web-0.6.2.tgz", + "integrity": "sha512-+7XvjBYwTx4vP5PYkf6Q6orubO/v+UgMU6By1GritrmShr9QpT3UKa4ANzXWQfhdqtBnQYXsm7ZNbdIHT6tYpQ==", + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/jsftp": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", + "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", + "license": "MIT", + "dependencies": { + "debug": "^3.1.0", + "ftp-response-parser": "^1.0.1", + "once": "^1.4.0", + "parse-listing": "^1.1.3", + "stream-combiner": "^0.2.2", + "unorm": "^1.4.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsftp/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-faker": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", + "integrity": "sha512-fNKLHgDvfGNNTX1zqIjqFMJjCLzJ2kvnJ831x4aqkAoeE4jE2TxvpJdhOnk3JU3s42vFzmXvkpbYzH5H3ncAzg==", + "license": "MIT", + "dependencies": { + "json-schema-ref-parser": "^6.1.0", + "jsonpath-plus": "^10.3.0" + }, + "bin": { + "jsf": "bin/gen.cjs" + } + }, + "node_modules/json-schema-ref-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", + "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", + "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", + "license": "MIT", + "dependencies": { + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.12.1", + "ono": "^4.0.11" + } + }, + "node_modules/json-schema-ref-parser/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/json-schema-ref-parser/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/jsonpath-plus": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", + "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", + "license": "MIT", + "dependencies": { + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/klaw": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", + "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", + "license": "MIT", + "engines": { + "node": ">=14.14.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-app": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", + "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@promptbook/utils": "0.69.5", + "type-fest": "4.26.0", + "userhome": "1.0.1" + } + }, + "node_modules/locate-app/node_modules/type-fest": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", + "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lockfile": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "license": "ISC", + "dependencies": { + "signal-exit": "^3.0.2" + } + }, + "node_modules/lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "license": "MIT", + "dependencies": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/method-override/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/method-override/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC", + "optional": true + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/modern-tar": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.2.tgz", + "integrity": "sha512-TGG1ZRk1TAQ3neuZwahAHke3rKsSlro+ooMYtjh9sl2gGPVMLMuWiHgwC7im9T5bSM566RSo2Dko56ETgEvZcA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.1.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "license": "MIT", + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-fetch/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT", + "optional": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ono": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", + "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", + "license": "MIT", + "dependencies": { + "format-util": "^1.0.3" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-changed": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", + "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", + "license": "ISC", + "dependencies": { + "commander": "^6.2.0" + }, + "bin": { + "package-changed": "bin/package-changed.js" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-listing": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", + "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", + "engines": { + "node": ">=0.6.21" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/patch-console": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", + "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/pixelmatch": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", + "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", + "dependencies": { + "pngjs": "^6.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pixelmatch/node_modules/pngjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/posthog-node": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.14.0.tgz", + "integrity": "sha512-cKY2Wdtjx5wlIWL9/Im5/FT+zeKaYjtG94rfrIFKTVoCdwV7S9PaU8frLD/8TpGx1SwOFgw7QTjhpa/vnxTlww==", + "license": "MIT", + "dependencies": { + "@posthog/core": "1.6.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-reconciler": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", + "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", + "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^2.0.1" + } + }, + "node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "license": "MIT" + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/rgb2hex": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", + "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", + "license": "MIT" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safaridriver": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-1.0.0.tgz", + "integrity": "sha512-J92IFbskyo7OYB3Dt4aTdyhag1GlInrfbPCmMteb7aBK7PwlnGz1HI0+oyNN97j7pV9DqUAVoVgkNRMrfY47mQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex2": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", + "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-arm": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", - "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT", + "optional": true + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.1.0" + "engines": { + "node": ">=10" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", - "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.1.0" + "engines": { + "node": ">= 18" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-s390x": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", - "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/send/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.1.0" + "node": ">= 0.8" } }, - "node_modules/sharp/node_modules/@img/sharp-linux-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", - "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.1.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", - "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/serialize-error": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-12.0.0.tgz", + "integrity": "sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==", + "license": "MIT", + "dependencies": { + "type-fest": "^4.31.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", - "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/serialize-error/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=16" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sharp/node_modules/@img/sharp-wasm32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", - "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-favicon": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", + "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", + "license": "MIT", "dependencies": { - "@emnapi/runtime": "^1.4.3" + "etag": "~1.8.1", + "fresh": "~0.5.2", + "ms": "~2.1.3", + "parseurl": "~1.3.2", + "safe-buffer": "~5.2.1" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">= 0.8.0" } }, - "node_modules/sharp/node_modules/@img/sharp-win32-ia32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", - "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">= 18" } }, - "node_modules/sharp/node_modules/@img/sharp-win32-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", - "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/shebang-command": { @@ -16654,9 +20854,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -16734,35 +20934,63 @@ "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", "dependencies": { - "is-arrayish": "^0.3.1" + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -16774,12 +21002,12 @@ } }, "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -16863,9 +21091,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "license": "CC0-1.0" }, "node_modules/spdy": { @@ -16925,9 +21153,9 @@ } }, "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, "node_modules/stack-trace": { @@ -16939,10 +21167,22 @@ "node": "*" } }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -16968,16 +21208,14 @@ } }, "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -17090,9 +21328,9 @@ } }, "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", "funding": [ { "type": "github", @@ -17127,10 +21365,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "license": "MIT", "dependencies": { "pump": "^3.0.0", @@ -17153,9 +21403,9 @@ } }, "node_modules/teen_process": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.3.2.tgz", - "integrity": "sha512-eiYtJbYrMz5WbZL68u05qCgLMShPZhYKVewZFoyT6C2xvNdMfikCP7Nh0K3Phiy+H4bMZ8q5GtJROFcoYwQJmQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", + "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", "dependencies": { "bluebird": "^3.7.2", @@ -17164,8 +21414,8 @@ "source-map-support": "^0.x" }, "engines": { - "node": "^16.13.0 || >=18.0.0", - "npm": ">=8" + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": ">=10" } }, "node_modules/text-decoder": { @@ -17189,6 +21439,18 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, + "node_modules/to-rotated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-rotated/-/to-rotated-1.0.0.tgz", + "integrity": "sha512-KsEID8AfgUy+pxVRLsWp0VzCa69wxzUDZnzGbyIST/bcgcrMvTYoFBX/QORH4YApoD89EDuUovx4BTdpOn319Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -17198,21 +21460,6 @@ "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "license": "MIT/X11", - "engines": { - "node": "*" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -17239,41 +21486,6 @@ "utf8-byte-length": "^1.0.1" } }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "license": "MIT", - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -17281,57 +21493,72 @@ "license": "0BSD" }, "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", + "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" } }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { - "node": ">=14.17" + "node": ">= 0.6" } }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/undici": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "license": "MIT" }, "node_modules/unorm": { @@ -17352,64 +21579,10 @@ "node": ">= 0.8" } }, - "node_modules/unzipper": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", - "license": "MIT", - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "license": "MIT" - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/unzipper/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", "license": "MIT" }, "node_modules/userhome": { @@ -17433,26 +21606,17 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "node_modules/validate-npm-package-license": { @@ -17465,12 +21629,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/validate.js": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz", - "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==", - "license": "MIT" - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -17535,145 +21693,135 @@ } }, "node_modules/webdriver": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.45.0.tgz", - "integrity": "sha512-guPEo1HeZ+4gvdvgMvnFpjTdqQ5SHkE7PKzWqhnDlSl6uhkFyiwSTt+77pgFLvjEPWesr3lpSTkvhyKQ8+Ov+g==", + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.20.1.tgz", + "integrity": "sha512-QtvYqPai2NOnq7qePPH6kNSwk7+tnmSvnlOnY8dIT/Y24TPdQp44NjF/BUYAWIlqoBlZqHClQFTSVwT2qvO2Tw==", "license": "MIT", "dependencies": { - "@types/node": "^22.2.0", + "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "8.45.0", - "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.44.0", - "@wdio/types": "8.41.0", - "@wdio/utils": "8.45.0", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", + "@wdio/config": "9.20.1", + "@wdio/logger": "9.18.0", + "@wdio/protocols": "9.16.2", + "@wdio/types": "9.20.0", + "@wdio/utils": "9.20.1", + "deepmerge-ts": "^7.0.3", + "https-proxy-agent": "^7.0.6", + "undici": "^6.21.3", "ws": "^8.8.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, - "node_modules/webdriver/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "node_modules/webdriver/node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" + "undici-types": "~6.21.0" } }, - "node_modules/webdriver/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/webdriver/node_modules/undici": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", + "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18.17" } }, + "node_modules/webdriver/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/webdriverio": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.45.0.tgz", - "integrity": "sha512-eLmEVLnBpnLdVr6vgCuNDU6XitPontbSORy7RbCHNykPqjpa2vQL4YigsV7K9YnPspGR1qhCe1uxsjAN5QGhCw==", - "license": "MIT", - "dependencies": { - "@types/node": "^22.2.0", - "@wdio/config": "8.45.0", - "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.44.0", - "@wdio/repl": "8.40.3", - "@wdio/types": "8.41.0", - "@wdio/utils": "8.45.0", - "archiver": "^7.0.0", - "aria-query": "^5.0.0", + "version": "9.20.1", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.20.1.tgz", + "integrity": "sha512-QVM/asb5sDESz37ow/BAOA0z2HtUJsuAjPKHdw+Vx92PaQP3EfHwTgxK2T5rgwa0WRNh+c+n/0nEqIvqBl01sA==", + "license": "MIT", + "dependencies": { + "@types/node": "^20.11.30", + "@types/sinonjs__fake-timers": "^8.1.5", + "@wdio/config": "9.20.1", + "@wdio/logger": "9.18.0", + "@wdio/protocols": "9.16.2", + "@wdio/repl": "9.16.2", + "@wdio/types": "9.20.0", + "@wdio/utils": "9.20.1", + "archiver": "^7.0.1", + "aria-query": "^5.3.0", + "cheerio": "^1.0.0-rc.12", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1400418", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", + "grapheme-splitter": "^1.0.4", + "htmlfy": "^0.8.1", "is-plain-obj": "^4.1.0", "jszip": "^3.10.1", "lodash.clonedeep": "^4.5.0", "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^21.11.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", + "query-selector-shadow-dom": "^1.0.1", + "resq": "^1.11.0", "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.45.0" + "serialize-error": "^12.0.0", + "urlpattern-polyfill": "^10.0.0", + "webdriver": "9.20.1" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" }, "peerDependencies": { - "devtools": "^8.14.0" + "puppeteer-core": ">=22.x || <=24.x" }, "peerDependenciesMeta": { - "devtools": { + "puppeteer-core": { "optional": true } } }, - "node_modules/webdriverio/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "node_modules/webdriverio/node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" + "undici-types": "~6.21.0" } }, - "node_modules/webdriverio/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/webdriverio/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "dependencies": { + "iconv-lite": "0.6.3" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "engines": { + "node": ">=18" } }, "node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -17682,17 +21830,55 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", + "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", + "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", @@ -17870,9 +22056,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -17908,9 +22094,9 @@ } }, "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -18044,15 +22230,6 @@ "node": "*" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -18064,6 +22241,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "license": "MIT" + }, "node_modules/zip-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", diff --git a/package.json b/package.json index a2a62fb..3848694 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective", - "version": "3.1.3-dev.1", + "version": "3.5.1", "description": "Treat doc content as testable assertions to validate doc accuracy and product UX.", "bin": { "doc-detective": "src/index.js" @@ -33,14 +33,20 @@ "homepage": "https://github.com/doc-detective/doc-detective#readme", "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", - "doc-detective-common": "^3.1.1", - "doc-detective-core": "^3.1.3-dev.1", + "axios": "^1.13.2", + "doc-detective-common": "^3.5.1", + "doc-detective-core": "^3.5.1", + "ink": "^6.5.1", + "ink-select-input": "^6.2.0", + "ink-spinner": "^5.0.0", + "js-yaml": "^4.1.1", + "react": "^19.2.0", "yargs": "^17.7.2" }, "devDependencies": { - "body-parser": "^2.2.0", - "chai": "^5.2.1", + "body-parser": "^2.2.1", + "chai": "^6.2.1", "express": "^5.1.0", - "mocha": "^11.7.1" + "mocha": "^11.7.5" } } diff --git a/samples/http.spec.yaml b/samples/http.spec.yaml index 9c46582..ceb3a62 100644 --- a/samples/http.spec.yaml +++ b/samples/http.spec.yaml @@ -1,37 +1,39 @@ tests: -- steps: - - loadVariables: env - - httpRequest: - url: http://localhost:8092/api/users - method: post - request: - body: - name: $USER - job: $JOB - response: - body: - name: John Doe - job: Software Engineer - - httpRequest: - url: http://localhost:8092/api/users - method: post - request: - body: - data: - - first_name: George - last_name: Bluth - id: 1 - response: - body: - data: - - first_name: George - last_name: Bluth - variables: - ID: $$response.body.data[0].id - - httpRequest: - url: http://localhost:8092/api/$ID - method: get - timeout: 1000 - savePath: response.json - maxVariation: 0 - overwrite: aboveVariation + - steps: + - loadVariables: env + - httpRequest: + url: http://localhost:8092/api/users + method: post + request: + body: + name: $USER + job: $JOB + response: + body: + name: John Doe + job: Software Engineer + - httpRequest: + url: http://localhost:8092/api/users + method: post + request: + body: + data: + - first_name: George + last_name: Bluth + id: 1 + response: + body: + data: + - first_name: George + last_name: Bluth + variables: + ID: $$response.body.data[0].id + - httpRequest: + url: http://localhost:8092/api/$ID + method: get + timeout: 1000 + savePath: response.json + maxVariation: 0 + overwrite: aboveVariation + testId: foobar +specId: edf6cf93-04f4-4931-ae7d-037bd75def9a diff --git a/samples/kitten-search.spec.json b/samples/kitten-search.spec.json index ac2c383..37f9339 100644 --- a/samples/kitten-search.spec.json +++ b/samples/kitten-search.spec.json @@ -3,26 +3,39 @@ { "steps": [ { - "action": "goTo", - "url": "https://www.duckduckgo.com" + "goTo": { + "url": "https://www.duckduckgo.com" + } }, { - "action": "find", - "selector": "#searchbox_input", - "click": true, - "typeKeys": { - "keys": ["American Shorthair kittens", "$ENTER$"] - } + "find": { + "selector": "#searchbox_input", + "click": "true", + "type": { + "keys": [ + "American Shorthair kittens", + "$ENTER$" + ] + } + }, + "variables": {} }, { - "action": "find", - "selector": "[data-testid='web-vertical']" + "find": { + "selector": "[data-testid='web-vertical']" + }, + "variables": {} }, { - "action": "saveScreenshot", - "path": "search-results.png" + "screenshot": { + "path": "search-results.png", + "maxVariation": 0 + } } - ] + ], + "detectSteps": true, + "testId": "efd34931-ba4f-47be-85bb-d8cb61123b8d" } - ] -} + ], + "specId": "02db96fc-7912-4eb6-ad79-9c96c2f1f8db" +} \ No newline at end of file diff --git a/samples/tests.spec.json b/samples/tests.spec.json deleted file mode 100644 index 4a37114..0000000 --- a/samples/tests.spec.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "id": "Do all the things! - Spec", - "contexts": [ - { - "app": { - "name": "firefox" - }, - "platforms": ["windows", "mac", "linux"] - } - ], - "tests": [ - { - "id": "Do all the things! - Test", - "description": "This test includes nearly every property across all actions.", - "steps": [ - { - "action": "setVariables", - "path": ".env" - }, - { - "action": "runShell", - "command": "echo", - "args": ["$USER"] - }, - { - "action": "checkLink", - "url": "https://www.duckduckgo.com" - }, - { - "action": "httpRequest", - "url": "https://reqres.in/api/users", - "method": "post", - "requestData": { - "name": "morpheus", - "job": "leader" - }, - "responseData": { - "name": "morpheus", - "job": "leader" - }, - "statusCodes": [200, 201] - }, - { - "action": "goTo", - "url": "https://www.google.com" - }, - { - "action": "find", - "selector": "[title=Search]", - "timeout": 10000, - "moveTo": true, - "click": true, - "typeKeys": { - "keys": ["shorthair cat", "$ENTER$"] - } - }, - { - "action": "wait" - }, - { - "action": "saveScreenshot", - "path": "screenshot.png", - "directory": "samples", - "maxVariation": 5, - "overwrite": "byVariation" - } - ] - } - ] -} diff --git a/scripts/bump-sync-version-core.js b/scripts/bump-sync-version-core.js index dede5fe..3aa9da5 100755 --- a/scripts/bump-sync-version-core.js +++ b/scripts/bump-sync-version-core.js @@ -20,8 +20,8 @@ function execCommand(command, options = {}) { function main() { // Clean git state - execCommand("git checkout -- ."); - execCommand("git clean -fd"); + execCommand("git checkout -- ."); + execCommand("git clean -fd"); // Get current project version const packageJsonPath = path.join(process.cwd(), "package.json"); @@ -54,42 +54,40 @@ function main() { // Extract major and minor versions using semver const projMajor = semver.major(projVersion); const projMinor = semver.minor(projVersion); + const projPatch = semver.patch(projVersion); const coreMajor = semver.major(coreVersion); const coreMinor = semver.minor(coreVersion); + const corePatch = semver.patch(coreVersion); - console.log(`Project version: ${projMajor}.${projMinor}.x`); - console.log(`core version: ${coreMajor}.${coreMinor}.x`); + console.log(`Project version: ${projMajor}.${projMinor}.${projPatch}`); + console.log(`core version: ${coreMajor}.${coreMinor}.${corePatch}`); let newVersion; if (projMajor !== coreMajor || projMinor !== coreMinor) { // Major or minor mismatch: set version to match doc-detective-core major.minor.0 newVersion = `${coreMajor}.${coreMinor}.0`; - - // Validate the new version before setting it - if (!semver.valid(newVersion)) { - console.error(`Error: Generated invalid version: ${newVersion}`); - process.exit(1); - } - console.log(`Version mismatch detected. Setting version to: ${newVersion}`); - execCommand(`npm version --no-git-tag-version ${newVersion}`); } else { // Project version is already equal or greater than core version, just bump patch - console.log("Project version is current or ahead. Bumping patch version."); - execCommand("npm version patch --no-git-tag-version"); - // Get the new version after bumping - const updatedPackageJson = JSON.parse( - fs.readFileSync(packageJsonPath, "utf8") + console.log( + "Project version is current or ahead. Bumping patch version to:", + newVersion ); - newVersion = updatedPackageJson.version; + newVersion = `${projMajor}.${projMinor}.${projPatch + 1}`; + } + + // Validate the new version before setting it + if (!semver.valid(newVersion)) { + console.error(`Error: Generated invalid version: ${newVersion}`); + process.exit(1); } + execCommand(`npm version --no-git-tag-version ${newVersion}`); + // Commit changes execCommand("git add package.json package-lock.json"); - execCommand( - 'git commit -m "update doc-detective-core [skip ci]"' - ); + execCommand('git commit -m "update doc-detective-core [skip ci]"'); // Create tag execCommand(`git tag "v${newVersion}"`); diff --git a/src/cli/App.js b/src/cli/App.js new file mode 100644 index 0000000..4358c51 --- /dev/null +++ b/src/cli/App.js @@ -0,0 +1,49 @@ +const React = require('react'); +const { Box, Text } = require('ink'); +const Spinner = require('ink-spinner').default; +const TestRunner = require('./TestRunner'); +const ResultsSummary = require('./ResultsSummary'); + +const App = ({ config, resolvedTests, state }) => { + return ( + + + + Doc Detective + + + + {state.phase === 'initializing' && ( + + + Initializing... + + + )} + + {state.phase === 'running' && ( + + )} + + {state.phase === 'completed' && state.results && ( + + )} + + {state.phase === 'error' && ( + + + ✖ Error + + {state.error} + + )} + + ); +}; + +module.exports = App; diff --git a/src/cli/ResultsSummary.js b/src/cli/ResultsSummary.js new file mode 100644 index 0000000..9941dd9 --- /dev/null +++ b/src/cli/ResultsSummary.js @@ -0,0 +1,182 @@ +const React = require('react'); +const { Box, Text } = require('ink'); + +const ResultsSummary = ({ results, config }) => { + if (!results || !results.summary) { + return ( + + No results available. + + ); + } + + const { specs, tests, contexts, steps } = results.summary; + + // Calculate totals + const totalSpecs = specs ? specs.pass + specs.fail + specs.warning + specs.skipped : 0; + const totalTests = tests ? tests.pass + tests.fail + tests.warning + tests.skipped : 0; + const totalContexts = contexts ? contexts.pass + contexts.fail + contexts.warning + contexts.skipped : 0; + const totalSteps = steps ? steps.pass + steps.fail + steps.warning + steps.skipped : 0; + + // Check for failures + const hasFailures = + (specs && specs.fail > 0) || + (tests && tests.fail > 0) || + (contexts && contexts.fail > 0) || + (steps && steps.fail > 0); + + // Check if all skipped + const allSpecsSkipped = + specs && specs.pass === 0 && specs.fail === 0 && specs.skipped > 0; + + return ( + + {/* Header */} + + + Test Results Summary + + + + {/* Summary sections */} + {specs && ( + + Specs + + Total: {totalSpecs} + {specs.pass > 0 && ✓ {specs.pass} passed } + {specs.fail > 0 && ✖ {specs.fail} failed } + {specs.warning > 0 && ⚠ {specs.warning} warnings } + {specs.skipped > 0 && ⊘ {specs.skipped} skipped} + + + )} + + {tests && ( + + Tests + + Total: {totalTests} + {tests.pass > 0 && ✓ {tests.pass} passed } + {tests.fail > 0 && ✖ {tests.fail} failed } + {tests.warning > 0 && ⚠ {tests.warning} warnings } + {tests.skipped > 0 && ⊘ {tests.skipped} skipped} + + + )} + + {contexts && ( + + Contexts + + Total: {totalContexts} + {contexts.pass > 0 && ✓ {contexts.pass} passed } + {contexts.fail > 0 && ✖ {contexts.fail} failed } + {contexts.warning > 0 && ⚠ {contexts.warning} warnings } + {contexts.skipped > 0 && ⊘ {contexts.skipped} skipped} + + + )} + + {steps && ( + + Steps + + Total: {totalSteps} + {steps.pass > 0 && ✓ {steps.pass} passed } + {steps.fail > 0 && ✖ {steps.fail} failed } + {steps.warning > 0 && ⚠ {steps.warning} warnings } + {steps.skipped > 0 && ⊘ {steps.skipped} skipped} + + + )} + + {/* Overall status */} + + {allSpecsSkipped ? ( + ⚠ All items were skipped + ) : hasFailures ? ( + + ✖ Tests failed + + ) : ( + + ✓ All tests passed! + + )} + + + {/* Failed items detail */} + {hasFailures && results.specs && ( + + + Failed Items: + + {getFailedItems(results).map((item, index) => ( + + + • {item} + + + ))} + + )} + + ); +}; + +// Helper function to extract failed items +function getFailedItems(results) { + const failures = []; + + if (!results.specs) return failures; + + results.specs.forEach((spec, specIndex) => { + if (spec.result === 'FAIL') { + failures.push(`Spec: ${spec.specId || `Spec ${specIndex + 1}`}`); + } + + if (spec.tests && spec.tests.length > 0) { + spec.tests.forEach((test, testIndex) => { + if (test.result === 'FAIL') { + failures.push( + `Test: ${test.testId || `Test ${testIndex + 1}`} (from ${ + spec.specId || `Spec ${specIndex + 1}` + })` + ); + } + + if (test.contexts && test.contexts.length > 0) { + test.contexts.forEach((context, contextIndex) => { + if ( + context.result === 'FAIL' || + (context.result && context.result.status === 'FAIL') + ) { + failures.push( + `Context: ${context.platform || 'unknown'}/${ + context.browser ? context.browser.name : 'unknown' + } (from ${test.testId || `Test ${testIndex + 1}`})` + ); + } + + if (context.steps && context.steps.length > 0) { + context.steps.forEach((step, stepIndex) => { + if (step.result === 'FAIL') { + failures.push( + `Step: ${step.stepId || `Step ${stepIndex + 1}`} - ${ + step.resultDescription || 'Unknown error' + }` + ); + } + }); + } + }); + } + }); + } + }); + + return failures; +} + +module.exports = ResultsSummary; diff --git a/src/cli/TestRunner.js b/src/cli/TestRunner.js new file mode 100644 index 0000000..97f3214 --- /dev/null +++ b/src/cli/TestRunner.js @@ -0,0 +1,54 @@ +const React = require('react'); +const { Box, Text } = require('ink'); +const Spinner = require('ink-spinner').default; + +const TestRunner = ({ config, progress, currentSpec, currentTest }) => { + return ( + + + + Running tests... + + + + {/* Progress bars */} + {progress.specs.total > 0 && ( + + + Specs: {progress.specs.current}/{progress.specs.total} + + + )} + + {progress.tests.total > 0 && ( + + + Tests: {progress.tests.current}/{progress.tests.total} + + + )} + + {progress.steps.total > 0 && ( + + + Steps: {progress.steps.current}/{progress.steps.total} + + + )} + + {/* Current execution context */} + {currentSpec && ( + + Current: {currentSpec} + {currentTest && ( + + → {currentTest} + + )} + + )} + + ); +}; + +module.exports = TestRunner; diff --git a/src/cli/builder/FieldEditor.mjs b/src/cli/builder/FieldEditor.mjs new file mode 100644 index 0000000..84aad68 --- /dev/null +++ b/src/cli/builder/FieldEditor.mjs @@ -0,0 +1,413 @@ +/** + * Field editor component - handles editing individual fields based on their schema (ESM version) + */ + +import React from 'react'; +const { useState, useEffect } = React; +import { Box, Text, useInput } from 'ink'; +import SelectInput from 'ink-select-input'; +import { SimpleTextInput, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; +import { validatePattern, describePattern, getFieldVariants, detectVariantIndex } from './schemaUtils.mjs'; + +/** + * Variant type selector for fields with anyOf + */ +const FieldVariantSelector = ({ field, currentValue, onSelect, onCancel }) => { + const variants = getFieldVariants(field); + const currentIndex = detectVariantIndex(currentValue, variants); + + useInput((input, key) => { + if (key.escape) { + onCancel(); + } + }); + + const items = variants.map((variant, index) => ({ + label: variant.title, + description: variant.description || '', + value: `variant_${index}`, + key: `variant_${index}`, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, field.name + ' - Select type:') + ), + React.createElement(ScrollableSelect, { + items, + initialIndex: currentIndex, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => { + const index = parseInt(item.value.replace('variant_', ''), 10); + onSelect(index, variants[index]); + }, + }), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to cancel)' + ) + ); +}; + +/** + * Universal field editor that adapts to field type + */ +const FieldEditor = ({ + field, + value, + onChange, + onSubmit, + onCancel, + autoFocus = true, +}) => { + const [localValue, setLocalValue] = useState( + value !== undefined ? String(value) : '' + ); + const [error, setError] = useState(null); + const [showVariantSelector, setShowVariantSelector] = useState(false); + const [selectedVariant, setSelectedVariant] = useState(null); + + // Check if this field has anyOf variants (and it's not just an enum) + const variants = getFieldVariants(field); + const hasMultipleVariants = variants.length > 1 && !field.enum; + + // Determine the effective field based on selected variant + const effectiveField = selectedVariant ? { + ...field, + type: selectedVariant.type, + pattern: selectedVariant.schema.pattern, + minimum: selectedVariant.schema.minimum, + maximum: selectedVariant.schema.maximum, + enum: selectedVariant.schema.enum, + default: selectedVariant.schema.default, + } : field; + + // Validate on change + useEffect(() => { + if (effectiveField.pattern && localValue) { + const isValid = validatePattern(localValue, effectiveField.pattern); + if (!isValid) { + setError(describePattern(effectiveField.pattern)); + } else { + setError(null); + } + } else { + setError(null); + } + }, [localValue, effectiveField.pattern]); + + // Handle escape key + useInput((input, key) => { + if (key.escape) { + if (showVariantSelector) { + setShowVariantSelector(false); + } else { + onCancel(); + } + } + }); + + // Show variant selector first if field has multiple variants and none selected + if (hasMultipleVariants && !selectedVariant && showVariantSelector === false && value === undefined) { + // Auto-show variant selector for new values + setShowVariantSelector(true); + return null; + } + + if (showVariantSelector && hasMultipleVariants) { + return React.createElement(FieldVariantSelector, { + field, + currentValue: value, + onSelect: (index, variant) => { + setSelectedVariant(variant); + setShowVariantSelector(false); + // Set default value based on variant type + if (variant.type === 'null') { + onChange(null); + onSubmit(null); + } else if (variant.type === 'boolean') { + setLocalValue('true'); + } else if (variant.type === 'number' || variant.type === 'integer') { + const defaultVal = variant.schema.default !== undefined ? String(variant.schema.default) : '0'; + setLocalValue(defaultVal); + } else { + setLocalValue(''); + } + }, + onCancel: () => { + setShowVariantSelector(false); + onCancel(); + }, + }); + } + + // Enum field - use select input + if (effectiveField.enum && Array.isArray(effectiveField.enum)) { + const items = effectiveField.enum.map((opt) => ({ + label: String(opt), + value: opt, + })); + + // Add option to switch type if field has variants + if (hasMultipleVariants) { + items.push({ label: '↔ Switch type...', value: '_switchType' }); + } + + const initialIndex = Math.max(0, effectiveField.enum.indexOf(value)); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 0 }, + React.createElement( + Text, + { bold: true, color: 'cyan' }, + field.name + ':' + ), + selectedVariant && React.createElement( + Text, + { color: 'gray' }, + ' (' + selectedVariant.title + ')' + ) + ), + field.description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + field.description + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items, + initialIndex, + onSelect: (item) => { + if (item.value === '_switchType') { + setShowVariantSelector(true); + } else { + onChange(item.value); + onSubmit(item.value); + } + }, + }) + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' (Esc to cancel)' + ) + ); + } + + // Boolean field + if (effectiveField.type === 'boolean') { + const items = [ + { label: 'true', value: true }, + { label: 'false', value: false }, + ]; + + // Add option to switch type if field has variants + if (hasMultipleVariants) { + items.push({ label: '↔ Switch type...', value: '_switchType' }); + } + + const initialIndex = value === true ? 0 : 1; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 0 }, + React.createElement( + Text, + { bold: true, color: 'cyan' }, + field.name + ':' + ), + selectedVariant && React.createElement( + Text, + { color: 'gray' }, + ' (' + selectedVariant.title + ')' + ) + ), + field.description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + field.description + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items, + initialIndex, + onSelect: (item) => { + if (item.value === '_switchType') { + setShowVariantSelector(true); + } else { + onChange(item.value); + onSubmit(item.value); + } + }, + }) + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' (Esc to cancel)' + ) + ); + } + + // Number/Integer field + if (effectiveField.type === 'number' || effectiveField.type === 'integer') { + const handleChange = (val) => { + setLocalValue(val); + // Allow empty or valid numbers + if (val === '' || val === '-') { + setError(null); + } else { + const num = Number(val); + if (isNaN(num)) { + setError('Must be a number'); + } else if (effectiveField.minimum !== undefined && num < effectiveField.minimum) { + setError(`Must be at least ${effectiveField.minimum}`); + } else if (effectiveField.maximum !== undefined && num > effectiveField.maximum) { + setError(`Must be at most ${effectiveField.maximum}`); + } else { + setError(null); + } + } + }; + + const handleSubmit = () => { + if (error) return; + const num = localValue === '' ? effectiveField.default : Number(localValue); + onChange(num); + onSubmit(num); + }; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + null, + React.createElement( + Text, + { bold: true, color: 'cyan' }, + field.name + ': ' + ), + selectedVariant && React.createElement( + Text, + { color: 'gray' }, + '(' + selectedVariant.title + ') ' + ), + React.createElement(SimpleTextInput, { + value: localValue, + onChange: handleChange, + onSubmit: handleSubmit, + focus: autoFocus, + }) + ), + field.description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + field.description + ), + effectiveField.default !== undefined && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' Default: ' + effectiveField.default + ), + hasMultipleVariants && + React.createElement( + Text, + { color: 'blue', dimColor: true }, + ' [Press Tab to switch type]' + ), + error && React.createElement(Text, { color: 'red' }, ' ✖ ' + error), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' (Enter to save, Esc to cancel)' + ) + ); + } + + // Default: String field + const handleSubmit = () => { + if (error) return; + onChange(localValue); + onSubmit(localValue); + }; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + null, + React.createElement( + Text, + { bold: true, color: 'cyan' }, + field.name + ': ' + ), + selectedVariant && React.createElement( + Text, + { color: 'gray' }, + '(' + selectedVariant.title + ') ' + ), + React.createElement(SimpleTextInput, { + value: localValue, + onChange: setLocalValue, + onSubmit: handleSubmit, + focus: autoFocus, + }) + ), + field.description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + field.description + ), + effectiveField.pattern && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' Pattern: ' + describePattern(effectiveField.pattern) + ), + effectiveField.default !== undefined && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' Default: ' + String(effectiveField.default) + ), + hasMultipleVariants && + React.createElement( + Text, + { color: 'blue', dimColor: true }, + ' [Type "?" to switch type]' + ), + error && React.createElement(Text, { color: 'red' }, ' ✖ ' + error), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' (Enter to save, Esc to cancel)' + ) + ); +}; + +export default FieldEditor; diff --git a/src/cli/builder/SpecSelector.mjs b/src/cli/builder/SpecSelector.mjs new file mode 100644 index 0000000..0b41d6d --- /dev/null +++ b/src/cli/builder/SpecSelector.mjs @@ -0,0 +1,208 @@ +/** + * Spec selector component for choosing which spec to edit + * When multiple input files are provided, this component displays a list + * of specs for the user to choose from. + */ + +import React from 'react'; +const { useState, useEffect } = React; +import { Box, Text, useApp } from 'ink'; +import * as path from 'path'; +import { ScrollableSelect, NoIndicator } from './components.mjs'; + +/** + * SpecSelector component - displays a list of specs to choose from + * @param {Object} props + * @param {Array} props.specs - Array of spec objects: { spec, filePath, extension, isValid, validationErrors } + * @param {string} props.outputDir - Output directory for new specs + */ +const SpecSelector = ({ specs, outputDir }) => { + const { exit } = useApp(); + const [selectedSpec, setSelectedSpec] = useState(null); + const [TestBuilder, setTestBuilder] = useState(null); + + // Dynamically import TestBuilder when a spec is selected + useEffect(() => { + if (selectedSpec) { + import('./TestBuilder.mjs').then(module => { + setTestBuilder(() => module.default); + }); + } + }, [selectedSpec]); + + // Handle going back to the spec list + const handleBack = () => { + setSelectedSpec(null); + setTestBuilder(null); + }; + + // If a spec is selected and TestBuilder is loaded, render the TestBuilder + if (selectedSpec && TestBuilder) { + return React.createElement(TestBuilder, { + initialSpec: selectedSpec.spec, + inputFilePath: selectedSpec.filePath, + inputFileExtension: selectedSpec.extension, + isValid: selectedSpec.isValid, + validationErrors: selectedSpec.validationErrors, + outputDir, + onBack: handleBack, + }); + } + + // Show loading state while TestBuilder is being imported + if (selectedSpec && !TestBuilder) { + return React.createElement( + Box, + { padding: 1 }, + React.createElement(Text, { color: 'cyan' }, 'Loading editor...') + ); + } + + // Build menu items from specs + const items = specs.map((specData, index) => { + const { spec, filePath, isValid, validationErrors } = specData; + const fileName = filePath ? path.basename(filePath) : 'untitled'; + const dirName = filePath ? path.dirname(filePath) : outputDir; + const specId = spec.specId || spec.id || `Spec ${index + 1}`; + const testCount = (spec.tests || []).length; + + // Build status indicator + let statusIcon = '✅'; + let statusColor = 'green'; + if (!isValid) { + statusIcon = '⚠️'; + statusColor = 'yellow'; + } + + return { + label: `${statusIcon} ${specId}`, + value: index, + specData, + fileName, + dirName, + testCount, + isValid, + validationErrors, + }; + }); + + // Add option to create new spec + items.push({ + label: '➕ Create new specification', + value: 'new', + }); + + // Add exit option + items.push({ + label: '🚪 Exit', + value: 'exit', + }); + + // Custom item component with additional details + const SpecItem = ({ isSelected, label, value, fileName, dirName, testCount, isValid, validationErrors }) => { + if (value === 'new' || value === 'exit') { + return React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: isSelected ? 'cyan' : 'white', bold: isSelected }, + (isSelected ? '❯ ' : ' ') + label + ) + ); + } + + return React.createElement( + Box, + { flexDirection: 'column', marginBottom: 1 }, + React.createElement( + Text, + { color: isSelected ? 'cyan' : 'white', bold: isSelected }, + (isSelected ? '❯ ' : ' ') + label + ), + React.createElement( + Box, + { marginLeft: 4, flexDirection: 'column' }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `📁 ${fileName}` + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `📂 ${dirName}` + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `📝 ${testCount} test${testCount !== 1 ? 's' : ''}` + ), + !isValid && validationErrors && React.createElement( + Text, + { color: 'yellow' }, + `⚠️ ${validationErrors}` + ) + ) + ); + }; + + const handleSelect = (item) => { + if (item.value === 'exit') { + exit(); + return; + } + + if (item.value === 'new') { + // Set a null selectedSpec to trigger TestBuilder with no initial spec + setSelectedSpec({ spec: null, filePath: null, extension: null, isValid: true }); + return; + } + + // Set the selected spec + setSelectedSpec(item.specData); + }; + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🔧 Doc Detective Test Builder') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'Select a specification to edit:') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `Found ${specs.length} specification${specs.length !== 1 ? 's' : ''}` + ) + ), + React.createElement(ScrollableSelect, { + items, + itemComponent: SpecItem, + indicatorComponent: NoIndicator, + onSelect: handleSelect, + linesPerItem: 5, // Each spec item takes ~5 lines (title + 3 details + margin) + reservedLines: 10, // Header, subtitle, count, footer hint, padding + }), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Use ↑↓ to navigate, Enter to select' + ) + ) + ); +}; + +export default SpecSelector; diff --git a/src/cli/builder/StepEditor.mjs b/src/cli/builder/StepEditor.mjs new file mode 100644 index 0000000..e4e406c --- /dev/null +++ b/src/cli/builder/StepEditor.mjs @@ -0,0 +1,639 @@ +/** + * Step editor component - handles editing individual steps (ESM version) + */ + +import React from 'react'; +const { useState, useMemo, useEffect } = React; +import { Box, Text, useInput } from 'ink'; +import SelectInput from 'ink-select-input'; +import { + getStepTypes, + getStepTypeFields, + getStepTypeInfo, + getStepTypeVariants, + getCommonStepProperties, + detectVariantIndex, + validateStep, +} from './schemaUtils.mjs'; +import FieldEditor from './FieldEditor.mjs'; +import { StatusBar, JsonPreview, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; + +/** + * Step type selector + */ +const StepTypeSelector = ({ onSelect, onCancel }) => { + const stepTypes = getStepTypes(); + + const items = stepTypes.map((type) => { + const info = getStepTypeInfo(type); + return { + label: type, + description: info.description, + value: type, + }; + }); + + useInput((input, key) => { + if (key.escape) { + onCancel(); + } + }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Select Step Type:') + ), + React.createElement(ScrollableSelect, { + items, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => onSelect(item.value), + }), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to cancel)' + ) + ); +}; + +/** + * Schema variant selector for step types with anyOf + */ +const VariantSelector = ({ stepType, currentValue, onSelect, onCancel }) => { + const variants = getStepTypeVariants(stepType); + const currentIndex = detectVariantIndex(currentValue, variants); + + useInput((input, key) => { + if (key.escape) { + onCancel(); + } + }); + + // Must have at least one variant to show selector + if (!variants || variants.length === 0) { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(Text, { color: 'yellow' }, `No variants found for ${stepType}. Press Esc to go back.`) + ); + } + + const items = variants.map((variant, index) => ({ + label: `${variant.title}${variant.type ? ` (${variant.type})` : ''}`, + value: `variant_${index}`, + key: `variant_${index}`, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, `Select ${stepType} format:`) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'This step type supports multiple formats. Choose one:' + ) + ), + React.createElement(SelectInput, { + items, + initialIndex: currentIndex, + onSelect: (item) => { + const index = parseInt(item.value.replace('variant_', ''), 10); + onSelect(index, variants[index]); + }, + }), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to cancel)' + ) + ); +}; + +/** + * Step editor - edit step fields + */ +const StepEditor = ({ + step, + stepIndex, + onChange, + onSave, + onCancel, + onDelete, +}) => { + const [view, setView] = useState('menu'); // 'menu', 'editField', 'addField', 'preview', 'selectType', 'selectVariant' + const [editingField, setEditingField] = useState(null); + const [localStep, setLocalStep] = useState(step); + const [pendingStepType, setPendingStepType] = useState(null); // For step type selection flow + + // Determine step type + const stepType = useMemo(() => { + const types = getStepTypes(); + return types.find((t) => localStep[t] !== undefined) || null; + }, [localStep]); + + // Get step value (could be string, number, boolean, or object) + const stepValue = stepType ? localStep[stepType] : null; + const valueType = typeof stepValue; + const isSimpleForm = valueType === 'string' || valueType === 'number' || valueType === 'boolean'; + + // Get variants for current step type + const variants = useMemo(() => { + if (!stepType) return []; + return getStepTypeVariants(stepType); + }, [stepType]); + + // Determine current variant + const currentVariantIndex = useMemo(() => { + if (variants.length === 0) return -1; + return detectVariantIndex(stepValue, variants); + }, [stepValue, variants]); + + const currentVariant = variants[currentVariantIndex] || null; + + // Get fields for this step type + const { fields: typeFields } = useMemo(() => { + if (!stepType) return { fields: [] }; + return getStepTypeFields(stepType); + }, [stepType]); + + // Get common step properties + const commonProps = getCommonStepProperties(); + + // Build current field values for menu + const currentFields = useMemo(() => { + const result = []; + + // Add step type value + if (stepType) { + if (isSimpleForm) { + result.push({ + name: stepType, + value: stepValue, + type: 'simple', + description: `The ${stepType} value`, + }); + } else if (typeof stepValue === 'object' && stepValue !== null) { + // Add object fields + Object.entries(stepValue).forEach(([key, val]) => { + const fieldDef = typeFields.find((f) => f.name === key); + result.push({ + name: `${stepType}.${key}`, + value: val, + type: fieldDef?.type || typeof val, + description: fieldDef?.description || '', + enum: fieldDef?.enum, + pattern: fieldDef?.pattern, + }); + }); + } + } + + // Add common step properties that are set + Object.entries(localStep).forEach(([key, val]) => { + if (key !== stepType && commonProps[key]) { + result.push({ + name: key, + value: val, + type: commonProps[key].type, + description: commonProps[key].description, + enum: commonProps[key].enum, + pattern: commonProps[key].pattern, + }); + } + }); + + return result; + }, [localStep, stepType, stepValue, isSimpleForm, typeFields, commonProps]); + + // Validation + const validation = useMemo(() => { + if (!stepType) return { valid: false, errors: 'No step type selected' }; + return validateStep(localStep); + }, [localStep, stepType]); + + // Handle escape - go back from any sub-view, or cancel from main menu + useInput((input, key) => { + if (key.escape) { + if (view === 'menu') { + onCancel(); + } else if (view === 'selectType' || view === 'selectVariant') { + onCancel(); + } else { + setView('menu'); + setEditingField(null); + } + } + }); + + // Select variant view (for step types with anyOf) - check this BEFORE selectType + if (view === 'selectVariant' && pendingStepType) { + const type = pendingStepType; + const typeVariants = getStepTypeVariants(type); + + // Safety check - if no variants, go back to menu + if (typeVariants.length === 0) { + const newStep = { [type]: {} }; + setLocalStep(newStep); + setPendingStepType(null); + setView('menu'); + return null; + } + + return React.createElement(VariantSelector, { + stepType: type, + currentValue: null, + onSelect: (variantIndex, variant) => { + // Safety check for variant + if (!variant) { + const newStep = { [type]: '' }; + setLocalStep(newStep); + setPendingStepType(null); + setView('menu'); + return; + } + + // Create step value based on selected variant + let newValue; + if (variant.type === 'string') { + newValue = ''; + } else if (variant.type === 'number' || variant.type === 'integer') { + newValue = variant.schema.default !== undefined ? variant.schema.default : 0; + } else if (variant.type === 'boolean') { + newValue = variant.schema.default !== undefined ? variant.schema.default : false; + } else if (variant.type === 'object') { + // Create object with required fields + newValue = {}; + const required = variant.schema.required || []; + if (variant.schema.properties) { + Object.entries(variant.schema.properties).forEach(([key, prop]) => { + if (required.includes(key)) { + if (prop.default !== undefined) { + newValue[key] = prop.default; + } else if (prop.type === 'string') { + newValue[key] = ''; + } else if (prop.type === 'number' || prop.type === 'integer') { + newValue[key] = 0; + } else if (prop.type === 'boolean') { + newValue[key] = false; + } else if (prop.type === 'array') { + newValue[key] = []; + } else if (prop.type === 'object') { + newValue[key] = {}; + } + } + }); + } + } else { + newValue = ''; + } + + const newStep = { [type]: newValue }; + setLocalStep(newStep); + setPendingStepType(null); + setView('menu'); + }, + onCancel: () => { + setPendingStepType(null); + setView('selectType'); + }, + }); + } + + // Select step type view + if (view === 'selectType' || !stepType) { + return React.createElement(StepTypeSelector, { + onSelect: (type) => { + // Check if this step type has variants + const typeVariants = getStepTypeVariants(type); + if (typeVariants.length > 1) { + // Show variant selector + setPendingStepType(type); + setView('selectVariant'); + } else if (typeVariants.length === 1) { + // Only one variant, use it directly + const variant = typeVariants[0]; + let defaultValue; + if (variant.type === 'string') { + defaultValue = ''; + } else if (variant.type === 'number' || variant.type === 'integer') { + defaultValue = variant.schema.default !== undefined ? variant.schema.default : 0; + } else if (variant.type === 'boolean') { + defaultValue = variant.schema.default !== undefined ? variant.schema.default : false; + } else { + defaultValue = {}; + } + const newStep = { [type]: defaultValue }; + setLocalStep(newStep); + setView('menu'); + } else { + // No variants, default to empty object + const newStep = { [type]: {} }; + setLocalStep(newStep); + setView('menu'); + } + }, + onCancel, + }); + } + + // Edit field view + if (view === 'editField' && editingField) { + // Determine field definition + let fieldDef = null; + let currentValue = null; + + if (editingField === stepType) { + // Editing simple form value + fieldDef = { + name: stepType, + type: 'string', + description: getStepTypeInfo(stepType).description, + ...typeFields.find((f) => f.name === '_simpleValue' || f.formType === 'simple'), + }; + currentValue = stepValue; + } else if (editingField.startsWith(stepType + '.')) { + // Editing object property + const propName = editingField.replace(stepType + '.', ''); + fieldDef = typeFields.find((f) => f.name === propName) || { + name: propName, + type: 'string', + description: '', + }; + currentValue = stepValue?.[propName]; + } else if (commonProps[editingField]) { + // Editing common property + const prop = commonProps[editingField]; + fieldDef = { + name: editingField, + type: prop.type, + description: prop.description, + default: prop.default, + enum: prop.enum, + pattern: prop.pattern, + }; + currentValue = localStep[editingField]; + } + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Step ' + (stepIndex + 1), stepType, editingField], + validationStatus: validation.valid, + }), + React.createElement(FieldEditor, { + field: fieldDef, + value: currentValue, + onChange: (newValue) => { + // Update the step + const newStep = { ...localStep }; + + if (editingField === stepType) { + // Simple form + newStep[stepType] = newValue; + } else if (editingField.startsWith(stepType + '.')) { + // Object property + const propName = editingField.replace(stepType + '.', ''); + if (typeof newStep[stepType] !== 'object') { + newStep[stepType] = {}; + } + newStep[stepType] = { ...newStep[stepType], [propName]: newValue }; + } else { + // Common property + newStep[editingField] = newValue; + } + + setLocalStep(newStep); + }, + onSubmit: () => setView('menu'), + onCancel: () => setView('menu'), + }) + ); + } + + // Add field view + if (view === 'addField') { + // Get available fields that aren't already set + const availableFields = []; + + // Type-specific fields (for object form) + if (!isSimpleForm) { + typeFields + .filter((f) => !f.name.startsWith('_') && f.formType !== 'simple') + .forEach((f) => { + const fullName = `${stepType}.${f.name}`; + if (!currentFields.find((cf) => cf.name === fullName)) { + availableFields.push({ + label: `${f.name}${f.required ? ' (required)' : ''}`, + description: f.description || '', + value: fullName, + }); + } + }); + } + + // Common properties + Object.entries(commonProps).forEach(([key, prop]) => { + if (key !== '$schema' && !currentFields.find((cf) => cf.name === key)) { + availableFields.push({ + label: key, + description: prop.description || '', + value: key, + }); + } + }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Step ' + (stepIndex + 1), stepType, 'Add Field'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Select field to add:') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true, marginBottom: 1 }, + '(Esc to go back)' + ), + React.createElement(ScrollableSelect, { + items: availableFields, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => { + setEditingField(item.value); + setView('editField'); + }, + }) + ); + } + + // Preview view + if (view === 'preview') { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Step ' + (stepIndex + 1), stepType, 'Preview'], + validationStatus: validation.valid, + }), + React.createElement(JsonPreview, { + data: localStep, + title: 'Step Preview', + }), + !validation.valid && + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(Text, { color: 'red' }, 'Validation errors: ' + validation.errors) + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items: [{ label: '← Back', value: 'back' }], + onSelect: () => setView('menu'), + }) + ) + ); + } + + // Main menu view + const menuItems = []; + let menuIndex = 0; + + // Show current format info if variants exist + if (variants.length > 1 && currentVariant) { + menuItems.push({ + label: `📋 Format: ${currentVariant.title}`, + value: `none_${menuIndex++}`, + }); + } + + // Current fields + currentFields.forEach((field) => { + const displayValue = + typeof field.value === 'object' + ? JSON.stringify(field.value).substring(0, 30) + : String(field.value).substring(0, 30); + menuItems.push({ + label: `✏️ ${field.name}: ${displayValue}${String(field.value).length > 30 ? '...' : ''}`, + value: `edit:${field.name}`, + }); + }); + + // Add separator + if (menuItems.length > 0) { + menuItems.push({ label: '─────── Actions ────────', value: `none_${menuIndex++}` }); + } + + // Actions + menuItems.push({ label: '➕ Add field', value: 'add' }); + menuItems.push({ label: '🔍 Preview JSON', value: 'preview' }); + menuItems.push({ label: '🔄 Change step type', value: 'changeType' }); + + if (currentFields.length > 0) { + menuItems.push({ label: '🗑️ Delete field...', value: 'deleteField' }); + } + + menuItems.push({ label: '─────── Save/Exit ──────', value: `none_${menuIndex++}` }); + + if (validation.valid) { + menuItems.push({ label: '💾 Save step', value: 'save' }); + } else { + menuItems.push({ + label: '⚠️ Fix errors before saving', + value: `none_${menuIndex++}`, + }); + } + + menuItems.push({ label: '🗑️ Delete step', value: 'delete' }); + menuItems.push({ label: '← Back (discard changes)', value: 'cancel' }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Step ' + (stepIndex + 1), stepType], + validationStatus: validation.valid, + hint: 'Use ↑↓ to navigate, Enter to select', + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Edit Step: '), + React.createElement(Text, { color: 'white' }, stepType) + ), + !validation.valid && + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'yellow' }, + '⚠️ Step has validation errors' + ) + ), + React.createElement(SelectInput, { + items: menuItems, + onSelect: (item) => { + const value = item.value; + + // Handle edit action (format: "edit:fieldName") + if (value.startsWith('edit:')) { + const field = value.substring(5); + setEditingField(field); + setView('editField'); + return; + } + + // Handle other actions + switch (value) { + case 'add': + setView('addField'); + break; + case 'preview': + setView('preview'); + break; + case 'switchVariant': + setView('selectVariant'); + break; + case 'changeType': + setView('selectType'); + break; + case 'deleteField': + // TODO: Implement delete field submenu + break; + case 'save': + onSave(localStep); + break; + case 'delete': + onDelete(); + break; + case 'cancel': + onCancel(); + break; + // Ignore 'none_*' values + } + }, + }) + ); +}; + +export default StepEditor; diff --git a/src/cli/builder/TestBuilder.mjs b/src/cli/builder/TestBuilder.mjs new file mode 100644 index 0000000..2685cc3 --- /dev/null +++ b/src/cli/builder/TestBuilder.mjs @@ -0,0 +1,685 @@ +/** + * Main test builder orchestrator (ESM version) + */ + +import React from 'react'; +const { useState, useMemo, useEffect } = React; +import { Box, Text, useInput, useApp } from 'ink'; +import SelectInput from 'ink-select-input'; +import * as fs from 'fs'; +import * as path from 'path'; +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const yaml = require('js-yaml'); +import { + createDefaultSpec, + createDefaultTest, + validateSpec, + getSpecFields, +} from './schemaUtils.mjs'; +import TestEditor from './TestEditor.mjs'; +import FieldEditor from './FieldEditor.mjs'; +import { StatusBar, JsonPreview, SimpleTextInput, LabeledTextInput, ConfirmPrompt, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; + +/** + * Determine the output file path based on input file and extension + * @param {string|null} inputFilePath - Original input file path + * @param {string|null} inputFileExtension - Original file extension + * @param {string} specName - Spec name for new files + * @param {string} outputDir - Default output directory + * @returns {string} The computed output file path + */ +function computeOutputPath(inputFilePath, inputFileExtension, specName, outputDir) { + if (inputFilePath) { + const ext = inputFileExtension?.toLowerCase() || path.extname(inputFilePath).toLowerCase(); + + // For JSON or YAML files, overwrite the original + if (ext === '.json' || ext === '.yaml' || ext === '.yml') { + return inputFilePath; + } + + // For other formats (e.g., .md), save as .spec.json in the same directory + const dir = path.dirname(inputFilePath); + const baseName = path.basename(inputFilePath, ext); + return path.join(dir, `${baseName}.spec.json`); + } + + // New file - use specName in outputDir + const safeName = specName.replace(/[^a-zA-Z0-9-_]/g, '-') || 'untitled'; + return path.join(outputDir, `${safeName}.spec.json`); +} + +/** + * Determine the output format based on file extension + * @param {string} filePath - The output file path + * @returns {'json'|'yaml'} The format to use + */ +function getOutputFormat(filePath) { + const ext = path.extname(filePath).toLowerCase(); + if (ext === '.yaml' || ext === '.yml') { + return 'yaml'; + } + return 'json'; +} + +/** + * Serialize spec to the appropriate format + * @param {Object} spec - The spec object + * @param {'json'|'yaml'} format - The output format + * @returns {string} Serialized content + */ +function serializeSpec(spec, format) { + if (format === 'yaml') { + return yaml.dump(spec, { + indent: 2, + lineWidth: -1, + noRefs: true, + quotingType: '"', + }); + } + return JSON.stringify(spec, null, 2); +} + +/** + * Main TestBuilder component + * @param {Object} props + * @param {Object|null} props.initialSpec - Initial spec to edit (optional) + * @param {string|null} props.inputFilePath - Path to the input file (for saving) + * @param {string|null} props.inputFileExtension - Original file extension + * @param {boolean} props.isValid - Whether the initial spec passed validation + * @param {string|null} props.validationErrors - Validation error message if invalid + * @param {string} props.outputDir - Output directory for new specs + * @param {Function|null} props.onBack - Callback to navigate back to spec selector (optional) + */ +const TestBuilder = ({ + initialSpec = null, + inputFilePath = null, + inputFileExtension = null, + isValid = true, + validationErrors = null, + outputDir = process.cwd(), + onBack = null, +}) => { + const { exit } = useApp(); + + // Determine if we're editing an existing file + const isEditing = initialSpec !== null && inputFilePath !== null; + + // Derive initial spec name from initialSpec.specId or filename + const deriveSpecName = () => { + if (initialSpec?.specId) { + return initialSpec.specId; + } + if (inputFilePath) { + const ext = path.extname(inputFilePath); + return path.basename(inputFilePath, ext); + } + return ''; + }; + + // State + const [phase, setPhase] = useState(isEditing ? 'menu' : 'name'); // Skip 'name' phase when editing + const [specName, setSpecName] = useState(deriveSpecName()); + const [spec, setSpec] = useState(initialSpec || createDefaultSpec()); + const [editingTestIndex, setEditingTestIndex] = useState(null); + const [editingField, setEditingField] = useState(null); + const [saveDir, setSaveDir] = useState(outputDir); + const [showValidationWarning, setShowValidationWarning] = useState(!isValid && isEditing); + + // Get spec fields + const { fields: specFields } = useMemo(() => getSpecFields(), []); + + // Validation - wrap in try-catch since validateSpec can throw for invalid specs + const validation = useMemo(() => { + try { + return validateSpec(spec); + } catch (err) { + return { valid: false, errors: err.message, object: spec }; + } + }, [spec]); + + // Get file path - use computed path for existing files, or generate new path + const filePath = useMemo(() => { + return computeOutputPath(inputFilePath, inputFileExtension, specName, saveDir); + }, [inputFilePath, inputFileExtension, specName, saveDir]); + + // Get output format + const outputFormat = useMemo(() => getOutputFormat(filePath), [filePath]); + + // Handle escape - exit from name phase, go back from sub-views + useInput((input, key) => { + if (key.escape) { + if (phase === 'name') { + exit(); + } else if (phase === 'menu') { + // Do nothing on menu, use Exit option + } else { + setPhase('menu'); + setEditingTestIndex(null); + setEditingField(null); + } + } + }); + + // Show validation warning for invalid loaded specs + if (showValidationWarning) { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'yellow' }, '⚠️ Validation Warning') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'The loaded specification has validation issues:') + ), + React.createElement( + Box, + { marginBottom: 1, marginLeft: 2 }, + React.createElement(Text, { color: 'yellow' }, validationErrors || 'Unknown validation errors') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'You can still edit the specification, but you may need to fix these issues before saving.') + ), + React.createElement(SelectInput, { + items: [ + { label: 'Continue editing', value: 'continue' }, + { label: 'Exit', value: 'exit' }, + ], + onSelect: (item) => { + if (item.value === 'exit') { + exit(); + } else { + setShowValidationWarning(false); + } + }, + }) + ); + } + + // Name input phase + if (phase === 'name') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🔧 Doc Detective Test Builder') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'Create a new test specification step by step.') + ), + React.createElement(LabeledTextInput, { + label: 'Spec name', + value: specName, + placeholder: 'my-tests', + onChange: setSpecName, + onSubmit: () => { + if (specName.trim()) { + // Initialize spec with specId + setSpec({ + ...spec, + specId: specName, + }); + setPhase('menu'); + } + }, + }), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Will be saved as: ' + filePath + ) + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Press Enter to continue, Esc to exit' + ) + ) + ); + } + + // Edit test view + if (phase === 'editTest' && editingTestIndex !== null) { + const currentTest = spec.tests?.[editingTestIndex] || createDefaultTest(); + + return React.createElement(TestEditor, { + test: currentTest, + testIndex: editingTestIndex, + onChange: (updatedTest) => { + const newTests = [...(spec.tests || [])]; + newTests[editingTestIndex] = updatedTest; + setSpec({ ...spec, tests: newTests }); + }, + onSave: (updatedTest) => { + const newTests = [...(spec.tests || [])]; + newTests[editingTestIndex] = updatedTest; + setSpec({ ...spec, tests: newTests }); + setPhase('menu'); + setEditingTestIndex(null); + }, + onCancel: () => { + setPhase('menu'); + setEditingTestIndex(null); + }, + onDelete: () => { + const newTests = [...(spec.tests || [])]; + newTests.splice(editingTestIndex, 1); + setSpec({ ...spec, tests: newTests }); + setPhase('menu'); + setEditingTestIndex(null); + }, + }); + } + + // Add test view + if (phase === 'addTest') { + const newTest = createDefaultTest(); + + return React.createElement(TestEditor, { + test: newTest, + testIndex: (spec.tests || []).length, + onChange: () => {}, + onSave: (newTest) => { + const newTests = [...(spec.tests || []), newTest]; + setSpec({ ...spec, tests: newTests }); + setPhase('menu'); + }, + onCancel: () => setPhase('menu'), + onDelete: () => setPhase('menu'), + }); + } + + // Edit spec metadata field + if (phase === 'editMeta' && editingField) { + const fieldDef = specFields.find((f) => f.name === editingField); + const currentValue = spec[editingField]; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: [specName, editingField], + validationStatus: validation.valid, + }), + React.createElement(FieldEditor, { + field: fieldDef, + value: currentValue, + onChange: (newValue) => { + setSpec({ ...spec, [editingField]: newValue }); + }, + onSubmit: () => setPhase('menu'), + onCancel: () => setPhase('menu'), + }) + ); + } + + // Add spec metadata field + if (phase === 'addMeta') { + const availableFields = specFields.filter((f) => { + if (f.name === 'tests') return false; + if (f.name === '$schema') return false; + return spec[f.name] === undefined; + }); + + const items = availableFields.map((f) => ({ + label: `${f.name}${f.required ? ' (required)' : ''}`, + description: f.description || '', + value: f.name, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: [specName, 'Add Property'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Select property to add:') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true, marginBottom: 1 }, + '(Esc to go back)' + ), + React.createElement(ScrollableSelect, { + items, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => { + setEditingField(item.value); + setPhase('editMeta'); + }, + }) + ); + } + + // Delete spec metadata field + if (phase === 'deleteMeta') { + const deletableFields = specFields.filter((f) => { + if (f.name === 'tests') return false; + if (f.name === '$schema') return false; + if (f.required) return false; + return spec[f.name] !== undefined; + }); + + const items = deletableFields.map((f) => ({ + label: `🗑️ ${f.name}: ${String(spec[f.name]).substring(0, 30)}`, + value: f.name, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: [specName, 'Delete Property'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'red' }, 'Select property to delete:') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true, marginBottom: 1 }, + '(Esc to go back)' + ), + React.createElement(SelectInput, { + items, + onSelect: (item) => { + const newSpec = { ...spec }; + delete newSpec[item.value]; + setSpec(newSpec); + setPhase('menu'); + }, + }) + ); + } + + // Preview view + if (phase === 'preview') { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: [specName, 'Preview'], + validationStatus: validation.valid, + }), + React.createElement(JsonPreview, { + data: spec, + title: `Specification Preview (${outputFormat.toUpperCase()})`, + }), + !validation.valid && + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(Text, { color: 'red' }, 'Validation errors: ' + validation.errors) + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items: [{ label: '← Back', value: 'back' }], + onSelect: () => setPhase('menu'), + }) + ) + ); + } + + // Save confirmation + if (phase === 'save') { + const isOverwrite = inputFilePath && (inputFileExtension === '.json' || inputFileExtension === '.yaml' || inputFileExtension === '.yml'); + const saveMessage = isOverwrite + ? `Overwrite ${filePath}?` + : `Save spec to ${filePath}?`; + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, saveMessage) + ), + outputFormat === 'yaml' && React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray', dimColor: true }, 'Format: YAML') + ), + React.createElement(ConfirmPrompt, { + message: '', + onConfirm: () => { + try { + // Ensure directory exists + const dir = path.dirname(filePath); + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + + // Serialize and write + const content = serializeSpec(spec, outputFormat); + fs.writeFileSync(filePath, content); + setPhase('saved'); + } catch (err) { + // TODO: Handle error better + console.error('Failed to save:', err); + setPhase('menu'); + } + }, + onCancel: () => setPhase('menu'), + }) + ); + } + + // Saved confirmation + if (phase === 'saved') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'green', bold: true }, '✅ Specification saved successfully!') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'File: ' + filePath) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray', dimColor: true }, 'Format: ' + outputFormat.toUpperCase()) + ), + React.createElement(SelectInput, { + items: [ + { label: 'Continue editing', value: 'continue' }, + { label: 'Exit', value: 'exit' }, + ], + onSelect: (item) => { + if (item.value === 'exit') { + exit(); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Main menu view + const menuItems = []; + let menuIndex = 0; + + // Spec metadata section + menuItems.push({ + label: '📋 Spec Properties', + value: `none_${menuIndex++}`, + }); + + specFields + .filter((f) => f.name !== 'tests' && f.name !== '$schema' && spec[f.name] !== undefined) + .forEach((f) => { + const val = spec[f.name]; + const displayVal = typeof val === 'object' ? JSON.stringify(val).substring(0, 25) : String(val).substring(0, 25); + menuItems.push({ + label: ` ✏️ ${f.name}: ${displayVal}${String(val).length > 25 ? '...' : ''}`, + value: `editMeta:${f.name}`, + }); + }); + + menuItems.push({ + label: ' ➕ Add property', + value: 'addMeta', + }); + menuItems.push({ + label: ' 🗑️ Delete property', + value: 'deleteMeta', + }); + + menuItems.push({ label: '─────── Tests ──────────', value: `none_${menuIndex++}` }); + + // Tests section + const tests = spec.tests || []; + menuItems.push({ + label: `📝 Tests (${tests.length})`, + value: `none_${menuIndex++}`, + }); + + tests.forEach((test, index) => { + const description = test.description || `Test ${index + 1}`; + const stepCount = (test.steps || []).length; + menuItems.push({ + label: ` ${index + 1}. ${description.substring(0, 30)}${description.length > 30 ? '...' : ''} (${stepCount} steps)`, + value: `editTest:${index}`, + }); + }); + + menuItems.push({ + label: ' ➕ Add test', + value: 'addTest', + }); + + menuItems.push({ label: '─────── Save/Exit ──────', value: `none_${menuIndex++}` }); + + // Actions + menuItems.push({ label: '🔍 Preview', value: 'preview' }); + + if (validation.valid && tests.length > 0) { + const saveLabel = isEditing ? '💾 Save (overwrite)' : '💾 Save specification'; + menuItems.push({ label: saveLabel, value: 'save' }); + } else if (tests.length === 0) { + menuItems.push({ + label: '⚠️ Add at least one test to save', + value: `none_${menuIndex++}`, + }); + } else { + menuItems.push({ + label: '⚠️ Fix validation errors to save', + value: `none_${menuIndex++}`, + }); + } + + // Add back option if we came from spec selector + if (onBack) { + menuItems.push({ label: '◀️ Back to spec list', value: 'back' }); + } + + menuItems.push({ label: '🚪 Exit (discard changes)', value: 'exit' }); + + // Build header info + const headerInfo = isEditing + ? `Editing: ${path.basename(inputFilePath)}` + : (specName || 'Untitled'); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName || path.basename(inputFilePath || 'New Spec')], + validationStatus: validation.valid, + hint: 'Use ↑↓ to navigate, Enter to select', + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🔧 Test Builder: '), + React.createElement(Text, { color: 'white' }, headerInfo) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `Output: ${filePath} (${outputFormat.toUpperCase()})` + ) + ), + React.createElement(SelectInput, { + items: menuItems, + onSelect: (item) => { + const value = item.value; + + // Handle editMeta action (format: "editMeta:fieldName") + if (value.startsWith('editMeta:')) { + const field = value.substring(9); + setEditingField(field); + setPhase('editMeta'); + return; + } + + // Handle editTest action (format: "editTest:index") + if (value.startsWith('editTest:')) { + const testIndex = parseInt(value.substring(9), 10); + setEditingTestIndex(testIndex); + setPhase('editTest'); + return; + } + + switch (value) { + case 'addMeta': + setPhase('addMeta'); + break; + case 'deleteMeta': + setPhase('deleteMeta'); + break; + case 'addTest': + setPhase('addTest'); + break; + case 'preview': + setPhase('preview'); + break; + case 'save': + setPhase('save'); + break; + case 'back': + if (onBack) onBack(); + break; + case 'exit': + exit(); + break; + // Ignore 'none_*' values + } + }, + }) + ); +}; + +export default TestBuilder; diff --git a/src/cli/builder/TestEditor.mjs b/src/cli/builder/TestEditor.mjs new file mode 100644 index 0000000..bee95a8 --- /dev/null +++ b/src/cli/builder/TestEditor.mjs @@ -0,0 +1,392 @@ +/** + * Test editor component - manages tests and their steps (ESM version) + */ + +import React from 'react'; +const { useState, useMemo } = React; +import { Box, Text, useInput } from 'ink'; +import SelectInput from 'ink-select-input'; +import { + getTestFields, + validateTest, + createDefaultStep, +} from './schemaUtils.mjs'; +import FieldEditor from './FieldEditor.mjs'; +import StepEditor from './StepEditor.mjs'; +import { StatusBar, JsonPreview, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; + +/** + * Test editor - edit test properties and manage steps + */ +const TestEditor = ({ + test, + testIndex, + onChange, + onSave, + onCancel, + onDelete, +}) => { + const [view, setView] = useState('menu'); // 'menu', 'editMeta', 'editStep', 'addStep', 'preview' + const [editingField, setEditingField] = useState(null); + const [editingStepIndex, setEditingStepIndex] = useState(null); + const [localTest, setLocalTest] = useState(test); + + // Get test fields + const { fields: testFields } = useMemo(() => getTestFields(), []); + + // Validation + const validation = useMemo(() => validateTest(localTest), [localTest]); + + // Handle escape - go back from any sub-view, or cancel from main menu + useInput((input, key) => { + if (key.escape) { + if (view === 'menu') { + onCancel(); + } else { + setView('menu'); + setEditingField(null); + setEditingStepIndex(null); + } + } + }); + + // Edit metadata field view + if (view === 'editMeta' && editingField) { + const fieldDef = testFields.find((f) => f.name === editingField); + const currentValue = localTest[editingField]; + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), editingField], + validationStatus: validation.valid, + }), + React.createElement(FieldEditor, { + field: fieldDef, + value: currentValue, + onChange: (newValue) => { + setLocalTest({ ...localTest, [editingField]: newValue }); + }, + onSubmit: () => setView('menu'), + onCancel: () => setView('menu'), + }) + ); + } + + // Edit step view + if (view === 'editStep' && editingStepIndex !== null) { + const currentStep = localTest.steps?.[editingStepIndex] || {}; + + return React.createElement(StepEditor, { + step: currentStep, + stepIndex: editingStepIndex, + onChange: (updatedStep) => { + const newSteps = [...(localTest.steps || [])]; + newSteps[editingStepIndex] = updatedStep; + setLocalTest({ ...localTest, steps: newSteps }); + }, + onSave: (updatedStep) => { + const newSteps = [...(localTest.steps || [])]; + newSteps[editingStepIndex] = updatedStep; + setLocalTest({ ...localTest, steps: newSteps }); + setView('menu'); + setEditingStepIndex(null); + }, + onCancel: () => { + setView('menu'); + setEditingStepIndex(null); + }, + onDelete: () => { + const newSteps = [...(localTest.steps || [])]; + newSteps.splice(editingStepIndex, 1); + setLocalTest({ ...localTest, steps: newSteps }); + setView('menu'); + setEditingStepIndex(null); + }, + }); + } + + // Add step view + if (view === 'addStep') { + // Create new step with step editor (it will prompt for type) + const newStep = createDefaultStep(); + + return React.createElement(StepEditor, { + step: newStep, + stepIndex: (localTest.steps || []).length, + onChange: () => {}, + onSave: (newStep) => { + const newSteps = [...(localTest.steps || []), newStep]; + setLocalTest({ ...localTest, steps: newSteps }); + setView('menu'); + }, + onCancel: () => setView('menu'), + onDelete: () => setView('menu'), + }); + } + + // Add metadata field view + if (view === 'addMeta') { + // Get fields that aren't already set + const availableFields = testFields.filter((f) => { + if (f.name === 'steps') return false; // Steps handled separately + if (f.name === '$schema') return false; + return localTest[f.name] === undefined; + }); + + const items = availableFields.map((f) => ({ + label: `${f.name}${f.required ? ' (required)' : ''}`, + description: f.description || '', + value: f.name, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), 'Add Property'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Select property to add:') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true, marginBottom: 1 }, + '(Esc to go back)' + ), + React.createElement(ScrollableSelect, { + items, + itemComponent: DescriptiveItem, + indicatorComponent: NoIndicator, + onSelect: (item) => { + setEditingField(item.value); + setView('editMeta'); + }, + }) + ); + } + + // Delete metadata field view + if (view === 'deleteMeta') { + const deletableFields = testFields.filter((f) => { + if (f.name === 'steps') return false; + if (f.name === '$schema') return false; + if (f.required) return false; + return localTest[f.name] !== undefined; + }); + + const items = deletableFields.map((f) => ({ + label: `🗑️ ${f.name}: ${String(localTest[f.name]).substring(0, 30)}`, + value: f.name, + })); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), 'Delete Property'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'red' }, 'Select property to delete:') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true, marginBottom: 1 }, + '(Esc to go back)' + ), + React.createElement(SelectInput, { + items, + onSelect: (item) => { + const newTest = { ...localTest }; + delete newTest[item.value]; + setLocalTest(newTest); + setView('menu'); + }, + }) + ); + } + + // Preview view + if (view === 'preview') { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), 'Preview'], + validationStatus: validation.valid, + }), + React.createElement(JsonPreview, { + data: localTest, + title: 'Test Preview', + }), + !validation.valid && + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(Text, { color: 'red' }, 'Validation errors: ' + validation.errors) + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items: [{ label: '← Back', value: 'back' }], + onSelect: () => setView('menu'), + }) + ) + ); + } + + // Main menu view + const menuItems = []; + let menuIndex = 0; + + // Test metadata + menuItems.push({ + label: '📝 Test Properties', + value: `none_${menuIndex++}`, + }); + + testFields + .filter((f) => f.name !== 'steps' && f.name !== '$schema' && localTest[f.name] !== undefined) + .forEach((f) => { + const val = localTest[f.name]; + const displayVal = typeof val === 'object' ? JSON.stringify(val).substring(0, 25) : String(val).substring(0, 25); + menuItems.push({ + label: ` ✏️ ${f.name}: ${displayVal}${String(val).length > 25 ? '...' : ''}`, + value: `editMeta:${f.name}`, + }); + }); + + menuItems.push({ + label: ' ➕ Add property', + value: 'addMeta', + }); + menuItems.push({ + label: ' 🗑️ Delete property', + value: 'deleteMeta', + }); + + menuItems.push({ label: '─────── Steps ──────────', value: `none_${menuIndex++}` }); + + // Steps section + const steps = localTest.steps || []; + menuItems.push({ + label: `📋 Steps (${steps.length})`, + value: `none_${menuIndex++}`, + }); + + steps.forEach((step, index) => { + // Determine step type + const stepType = Object.keys(step).find((k) => !['id', 'description', 'screenshot', 'softAssert', 'wait'].includes(k)); + const stepValue = step[stepType]; + const displayValue = typeof stepValue === 'string' ? stepValue.substring(0, 20) : ''; + + menuItems.push({ + label: ` ${index + 1}. ${stepType}${displayValue ? ': ' + displayValue : ''}${displayValue.length >= 20 ? '...' : ''}`, + value: `editStep:${index}`, + }); + }); + + menuItems.push({ + label: ' ➕ Add step', + value: 'addStep', + }); + + menuItems.push({ label: '─────── Save/Exit ──────', value: `none_${menuIndex++}` }); + + // Actions + menuItems.push({ label: '🔍 Preview JSON', value: 'preview' }); + + if (validation.valid) { + menuItems.push({ label: '💾 Save test', value: 'save' }); + } else { + menuItems.push({ + label: '⚠️ Fix errors before saving', + value: `none_${menuIndex++}`, + }); + } + + menuItems.push({ label: '🗑️ Delete test', value: 'delete' }); + menuItems.push({ label: '← Back (discard changes)', value: 'cancel' }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1)], + validationStatus: validation.valid, + hint: 'Use ↑↓ to navigate, Enter to select', + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, 'Edit Test'), + localTest.description && + React.createElement(Text, { color: 'gray' }, ': ' + localTest.description) + ), + !validation.valid && + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'yellow' }, + '⚠️ Test has validation errors' + ) + ), + React.createElement(SelectInput, { + items: menuItems, + onSelect: (item) => { + const value = item.value; + + // Handle editMeta action (format: "editMeta:fieldName") + if (value.startsWith('editMeta:')) { + const field = value.substring(9); + setEditingField(field); + setView('editMeta'); + return; + } + + // Handle editStep action (format: "editStep:index") + if (value.startsWith('editStep:')) { + const stepIndex = parseInt(value.substring(9), 10); + setEditingStepIndex(stepIndex); + setView('editStep'); + return; + } + + switch (value) { + case 'addMeta': + setView('addMeta'); + break; + case 'deleteMeta': + setView('deleteMeta'); + break; + case 'addStep': + setView('addStep'); + break; + case 'preview': + setView('preview'); + break; + case 'save': + onSave(localTest); + break; + case 'delete': + onDelete(); + break; + case 'cancel': + onCancel(); + break; + // Ignore 'none_*' values + } + }, + }) + ); +}; + +export default TestEditor; diff --git a/src/cli/builder/builderRunner.js b/src/cli/builder/builderRunner.js new file mode 100644 index 0000000..9cc2f70 --- /dev/null +++ b/src/cli/builder/builderRunner.js @@ -0,0 +1,82 @@ +/** + * Builder runner - launches the Ink-based test builder + * Uses dynamic imports to handle ESM dependencies + */ + +/** + * Run the interactive test builder + * @param {Object} options - Builder options + * @param {string} options.outputDir - Output directory for the spec file + * @param {Object} options.initialSpec - Initial spec to edit (optional, deprecated - use specs instead) + * @param {Array} options.specs - Array of spec objects to choose from: { spec, filePath, extension, isValid, validationErrors } + * @returns {Promise} + */ +async function runBuilder(options = {}) { + const { outputDir = process.cwd(), initialSpec = null, specs = [] } = options; + + // Clear terminal and move cursor to top-left + process.stdout.write('\x1b[2J\x1b[H'); + + // Dynamic import of ESM modules + const [{ render }, React, TestBuilderModule, SpecSelectorModule] = await Promise.all([ + import('ink'), + import('react'), + import('./TestBuilder.mjs'), + import('./SpecSelector.mjs'), + ]); + + const TestBuilder = TestBuilderModule.default; + const SpecSelector = SpecSelectorModule.default; + + return new Promise((resolve, reject) => { + try { + let component; + + if (specs.length > 1) { + // Multiple specs - show selector + component = React.createElement(SpecSelector, { + specs, + outputDir, + }); + } else if (specs.length === 1) { + // Single spec - go directly to editor + const { spec, filePath, extension, isValid, validationErrors } = specs[0]; + component = React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: filePath, + inputFileExtension: extension, + isValid, + validationErrors, + outputDir, + }); + } else if (initialSpec) { + // Legacy: initialSpec provided directly + component = React.createElement(TestBuilder, { + initialSpec, + outputDir, + }); + } else { + // No specs - create new + component = React.createElement(TestBuilder, { + outputDir, + }); + } + + const app = render(component, { + // Use fullscreen mode to fill the terminal + exitOnCtrlC: true, + }); + + // Wait for the app to exit + app.waitUntilExit().then(() => { + // Clear screen on exit for clean terminal + process.stdout.write('\x1b[2J\x1b[H'); + resolve(); + }); + } catch (error) { + reject(error); + } + }); +} + +module.exports = { runBuilder }; diff --git a/src/cli/builder/components.mjs b/src/cli/builder/components.mjs new file mode 100644 index 0000000..7f27046 --- /dev/null +++ b/src/cli/builder/components.mjs @@ -0,0 +1,418 @@ +/** + * Reusable components for the test builder (ESM version) + */ + +import React from 'react'; +const { useState, useEffect, useMemo } = React; +import { Box, Text, useInput, useStdout } from 'ink'; +import SelectInput from 'ink-select-input'; + +/** + * Custom item component for SelectInput that wraps text properly + */ +export const DescriptiveItem = ({ isSelected, label, description }) => { + return React.createElement( + Box, + { flexDirection: 'column', marginBottom: description ? 1 : 0 }, + React.createElement( + Text, + { + color: isSelected ? 'cyan' : 'white', + bold: isSelected, + }, + (isSelected ? '❯ ' : ' ') + label + ), + description && React.createElement( + Box, + { marginLeft: 4 }, + React.createElement( + Text, + { color: 'gray', dimColor: true, wrap: 'wrap' }, + description + ) + ) + ); +}; + +/** + * Custom indicator that works with DescriptiveItem (returns null since indicator is in item) + */ +export const NoIndicator = () => null; + +/** + * Scrollable SelectInput with viewport indicators + * Shows ▲ when there are items above the viewport + * Shows ▼ when there are items below the viewport + * @param {Object} props + * @param {Array} props.items - Menu items + * @param {Function} props.onSelect - Selection handler + * @param {Component} props.itemComponent - Custom item renderer + * @param {Component} props.indicatorComponent - Custom indicator + * @param {number} props.limit - Fixed limit (overrides dynamic calculation) + * @param {number} props.linesPerItem - Lines each item takes (for dynamic limit calculation) + * @param {number} props.reservedLines - Lines reserved for header/footer (default: 8) + * @param {number} props.initialIndex - Initial selected index + */ +export const ScrollableSelect = ({ + items, + onSelect, + itemComponent = DescriptiveItem, + indicatorComponent = NoIndicator, + limit: customLimit, + linesPerItem = 3, + reservedLines = 8, + initialIndex = 0, +}) => { + const { stdout } = useStdout(); + const [selectedIndex, setSelectedIndex] = useState(initialIndex); + + // Calculate visible items based on terminal height + const terminalHeight = stdout?.rows || 24; + const availableLines = Math.max(terminalHeight - reservedLines, linesPerItem); + const defaultLimit = Math.max(1, Math.floor(availableLines / linesPerItem)); + const limit = customLimit || defaultLimit; + + // Track scroll position + const scrollOffset = useMemo(() => { + if (selectedIndex < limit) { + return 0; + } + return Math.min(selectedIndex - limit + 1, items.length - limit); + }, [selectedIndex, limit, items.length]); + + const hasItemsAbove = scrollOffset > 0; + const hasItemsBelow = scrollOffset + limit < items.length; + + // Handle keyboard navigation to track selected index + useInput((input, key) => { + if (key.upArrow) { + setSelectedIndex(prev => Math.max(0, prev - 1)); + } else if (key.downArrow) { + setSelectedIndex(prev => Math.min(items.length - 1, prev + 1)); + } + }); + + return React.createElement( + Box, + { flexDirection: 'column' }, + // Scroll up indicator + hasItemsAbove && React.createElement( + Box, + { marginLeft: 2 }, + React.createElement( + Text, + { color: 'yellow' }, + `▲ ${scrollOffset} more above` + ) + ), + // The actual select input + React.createElement(SelectInput, { + items, + limit, + initialIndex, + itemComponent, + indicatorComponent, + onSelect, + onHighlight: (item) => { + const idx = items.findIndex(i => i.value === item.value); + if (idx !== -1) setSelectedIndex(idx); + }, + }), + // Scroll down indicator + hasItemsBelow && React.createElement( + Box, + { marginLeft: 2 }, + React.createElement( + Text, + { color: 'yellow' }, + `▼ ${items.length - scrollOffset - limit} more below` + ) + ) + ); +}; + +/** + * Simple text input using ink's useInput hook + */ +export const SimpleTextInput = ({ value, onChange, onSubmit, placeholder = '', focus = true }) => { + const [cursorVisible, setCursorVisible] = useState(true); + + // Blink cursor + useEffect(() => { + if (!focus) return; + const interval = setInterval(() => { + setCursorVisible((v) => !v); + }, 500); + return () => clearInterval(interval); + }, [focus]); + + useInput( + (input, key) => { + if (!focus) return; + + if (key.return) { + if (onSubmit) onSubmit(value); + return; + } + + if (key.backspace || key.delete) { + onChange(value.slice(0, -1)); + return; + } + + // Ignore control characters + if (key.ctrl || key.meta || key.escape) { + return; + } + + // Add printable characters + if (input && !key.ctrl && !key.meta) { + onChange(value + input); + } + }, + { isActive: focus } + ); + + const displayValue = value || ''; + const showPlaceholder = displayValue.length === 0 && placeholder; + + return React.createElement( + Box, + null, + showPlaceholder + ? React.createElement(Text, { color: 'gray', dimColor: true }, placeholder) + : React.createElement(Text, null, displayValue), + focus && cursorVisible && React.createElement(Text, { color: 'cyan' }, '█') + ); +}; + +/** + * Labeled text input with validation support + */ +export const LabeledTextInput = ({ + label, + value, + onChange, + placeholder = '', + error = null, + description = '', + focus = true, + onSubmit, +}) => { + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + null, + React.createElement(Text, { bold: true, color: 'cyan' }, label + ': '), + React.createElement(SimpleTextInput, { + value: value || '', + onChange, + placeholder, + focus, + onSubmit, + }) + ), + description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + description + ), + error && + React.createElement(Text, { color: 'red' }, ' ✖ ' + error) + ); +}; + +/** + * Labeled enum selector + */ +export const EnumSelector = ({ + label, + options, + value, + onSelect, + description = '', +}) => { + const items = options.map((opt) => ({ + label: opt, + value: opt, + })); + + // Find initial index + const initialIndex = Math.max(0, options.indexOf(value)); + + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement( + Box, + { marginBottom: 0 }, + React.createElement(Text, { bold: true, color: 'cyan' }, label + ':') + ), + description && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + ' ' + description + ), + React.createElement(SelectInput, { + items, + initialIndex, + onSelect: (item) => onSelect(item.value), + }) + ); +}; + +/** + * Navigation menu with title + */ +export const Menu = ({ + title, + items, + onSelect, + description = '', +}) => { + return React.createElement( + Box, + { flexDirection: 'column' }, + title && + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, title) + ), + description && + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, description) + ), + React.createElement(SelectInput, { + items, + onSelect: (item) => onSelect(item.value, item), + }) + ); +}; + +/** + * Display JSON with syntax highlighting + */ +export const JsonPreview = ({ data, title = 'Preview', maxLines = 30 }) => { + const jsonStr = JSON.stringify(data, null, 2); + const lines = jsonStr.split('\n'); + const truncated = lines.length > maxLines; + const displayLines = truncated ? lines.slice(0, maxLines) : lines; + + const getLineColor = (line) => { + if (line.includes('": "')) return 'green'; + if (line.includes('": true') || line.includes('": false')) return 'yellow'; + if (line.includes('": null')) return 'gray'; + if (/": \d/.test(line)) return 'magenta'; + return 'white'; + }; + + return React.createElement( + Box, + { flexDirection: 'column', borderStyle: 'single', borderColor: 'gray', paddingX: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, title) + ), + React.createElement( + Box, + { flexDirection: 'column' }, + displayLines.map((line, i) => + React.createElement( + Text, + { key: i, color: getLineColor(line) }, + line + ) + ) + ), + truncated && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + `... (${lines.length - maxLines} more lines)` + ) + ); +}; + +/** + * Status bar showing current location and validation status + */ +export const StatusBar = ({ + location = [], + validationStatus = null, + hint = '', +}) => { + const locationStr = location.length > 0 ? location.join(' > ') : 'Home'; + + return React.createElement( + Box, + { + flexDirection: 'row', + justifyContent: 'space-between', + borderStyle: 'single', + borderColor: 'gray', + paddingX: 1, + marginBottom: 1, + }, + React.createElement( + Box, + null, + React.createElement(Text, { color: 'cyan' }, '📍 '), + React.createElement(Text, { bold: true }, locationStr) + ), + validationStatus !== null && + React.createElement( + Box, + null, + validationStatus + ? React.createElement(Text, { color: 'green' }, '✓ Valid') + : React.createElement(Text, { color: 'red' }, '✖ Invalid') + ), + hint && + React.createElement( + Text, + { color: 'gray', dimColor: true }, + hint + ) + ); +}; + +/** + * Yes/No confirmation prompt + */ +export const ConfirmPrompt = ({ message, onConfirm, onCancel }) => { + useInput((input, key) => { + if (input.toLowerCase() === 'y' || key.return) { + onConfirm(); + } else if (input.toLowerCase() === 'n' || key.escape) { + onCancel(); + } + }); + + return React.createElement( + Box, + null, + React.createElement(Text, { color: 'yellow' }, message + ' '), + React.createElement(Text, { color: 'gray' }, '(Y/n)') + ); +}; + +export default { + SimpleTextInput, + LabeledTextInput, + EnumSelector, + Menu, + JsonPreview, + StatusBar, + ConfirmPrompt, + DescriptiveItem, + NoIndicator, + ScrollableSelect, +}; diff --git a/src/cli/builder/index.js b/src/cli/builder/index.js new file mode 100644 index 0000000..ed12b4e --- /dev/null +++ b/src/cli/builder/index.js @@ -0,0 +1,11 @@ +/** + * Builder module index + * + * Note: Most builder components are ESM (.mjs files) that are dynamically + * imported by builderRunner.js to avoid ESM/CommonJS compatibility issues + * with ink@6.x which uses top-level await. + */ + +module.exports = { + runBuilder: require('./builderRunner').runBuilder, +}; diff --git a/src/cli/builder/schemaUtils.mjs b/src/cli/builder/schemaUtils.mjs new file mode 100644 index 0000000..9ab40f5 --- /dev/null +++ b/src/cli/builder/schemaUtils.mjs @@ -0,0 +1,526 @@ +/** + * Schema utilities for the interactive test builder (ESM version) + * Extracts field definitions, enums, patterns, and validation requirements + * from doc-detective-common JSON schemas + */ + +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const { schemas, validate } = require('doc-detective-common'); + +/** + * Get all available step types from the step schema + * @returns {string[]} Array of step type names + */ +export function getStepTypes() { + const stepSchema = schemas.step_v3; + return stepSchema.anyOf + .map((option) => { + const required = option.allOf?.[1]?.required; + return required ? required[0] : null; + }) + .filter(Boolean) + .sort(); +} + +/** + * Get the schema for a specific step type + * @param {string} stepType - The step type (e.g., 'goTo', 'click') + * @returns {Object|null} The schema for the step type + */ +export function getStepTypeSchema(stepType) { + const schemaKey = `${stepType}_v3`; + return schemas[schemaKey] || null; +} + +/** + * Get the common properties shared by all steps + * @returns {Object} Common step properties schema + */ +export function getCommonStepProperties() { + const stepSchema = schemas.step_v3; + return stepSchema.components?.schemas?.common?.properties || {}; +} + +/** + * Get the anyOf variants for a step type (e.g., "simple" vs "detailed") + * @param {string} stepType - The step type + * @returns {Array<{index: number, title: string, type: string, description: string, schema: Object}>} + */ +export function getStepTypeVariants(stepType) { + const schema = getStepTypeSchema(stepType); + if (!schema || !schema.anyOf) { + return []; + } + + return schema.anyOf.map((opt, index) => ({ + index, + title: opt.title || opt.description || `Variant ${index + 1}`, + type: opt.type || 'object', + description: opt.description || '', + schema: opt, + })); +} + +/** + * Get the anyOf variants for a field property + * @param {Object} prop - The property schema + * @returns {Array<{index: number, title: string, type: string, description: string, schema: Object}>} + */ +export function getFieldVariants(prop) { + if (!prop || !prop.anyOf) { + return []; + } + + return prop.anyOf.map((opt, index) => ({ + index, + title: opt.title || opt.type || `Variant ${index + 1}`, + type: opt.type || 'object', + description: opt.description || '', + schema: opt, + })); +} + +/** + * Determine which anyOf variant a value matches + * @param {any} value - The current value + * @param {Array} variants - The anyOf variants + * @returns {number} The index of the matching variant, or 0 if no match + */ +export function detectVariantIndex(value, variants) { + if (variants.length === 0) { + return 0; + } + + // Handle null first (before checking undefined) + if (value === null) { + for (let i = 0; i < variants.length; i++) { + if (variants[i].type === 'null') { + return i; + } + } + return 0; + } + + if (value === undefined) { + return 0; + } + + const valueType = typeof value; + + for (let i = 0; i < variants.length; i++) { + const variant = variants[i]; + if (variant.type === valueType) { + return i; + } + // Handle integer (typeof returns 'number') + if (variant.type === 'integer' && valueType === 'number' && Number.isInteger(value)) { + return i; + } + } + + return 0; +} + +/** + * Extract field information from a schema property + * @param {Object} prop - The property schema + * @param {string} name - The property name + * @returns {Object} Field information + */ +export function extractFieldInfo(prop, name) { + const info = { + name, + type: prop.type, + description: prop.description || '', + required: false, + default: prop.default, + enum: null, + pattern: null, + minimum: prop.minimum, + maximum: prop.maximum, + items: null, + properties: null, + anyOf: null, + }; + + // Handle enum + if (prop.enum) { + info.enum = prop.enum; + info.type = 'enum'; + } + + // Handle pattern + if (prop.pattern) { + info.pattern = prop.pattern; + } + + // Handle anyOf (multiple types or enum options) + if (prop.anyOf) { + info.anyOf = prop.anyOf; + // Check if any option has an enum + const enumOption = prop.anyOf.find((opt) => opt.enum); + if (enumOption) { + info.enum = enumOption.enum; + } + // Check if any option has a pattern + const patternOption = prop.anyOf.find((opt) => opt.pattern); + if (patternOption) { + info.pattern = patternOption.pattern; + } + // Determine combined types + info.type = prop.anyOf + .map((opt) => opt.type) + .filter(Boolean) + .join('|'); + } + + // Handle array items + if (prop.type === 'array' && prop.items) { + info.items = prop.items; + } + + // Handle object properties + if (prop.type === 'object' && prop.properties) { + info.properties = prop.properties; + } + + // Handle patternProperties (for outputs/variables) + if (prop.patternProperties) { + info.patternProperties = prop.patternProperties; + } + + return info; +} + +/** + * Get fields for a step type, including which are required + * @param {string} stepType - The step type + * @returns {Object} { fields: FieldInfo[], requiredFields: string[] } + */ +export function getStepTypeFields(stepType) { + const schema = getStepTypeSchema(stepType); + if (!schema) { + return { fields: [], requiredFields: [] }; + } + + const fields = []; + const requiredFields = []; + + // Handle simple string type (e.g., goTo: "https://...") + const hasSimpleForm = schema.anyOf?.some((opt) => opt.type === 'string'); + const hasObjectForm = schema.anyOf?.some((opt) => opt.type === 'object'); + + if (hasSimpleForm && hasObjectForm) { + // This step type supports both simple string and object forms + const simpleOption = schema.anyOf.find((opt) => opt.type === 'string'); + const objectOption = schema.anyOf.find((opt) => opt.type === 'object'); + + // Add a meta field to indicate the form type + fields.push({ + name: '_formType', + type: 'enum', + description: 'Choose simple (single value) or detailed (multiple options) form', + enum: ['simple', 'detailed'], + default: 'simple', + required: true, + }); + + // Add simple form field + if (simpleOption) { + fields.push({ + ...extractFieldInfo(simpleOption, '_simpleValue'), + formType: 'simple', + required: true, + }); + } + + // Add object form fields + if (objectOption && objectOption.properties) { + const objRequired = objectOption.required || []; + Object.entries(objectOption.properties).forEach(([key, prop]) => { + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.formType = 'detailed'; + fieldInfo.required = objRequired.includes(key); + if (fieldInfo.required) { + requiredFields.push(key); + } + fields.push(fieldInfo); + }); + } + } else if (schema.type === 'object' && schema.properties) { + // Simple object type + const objRequired = schema.required || []; + Object.entries(schema.properties).forEach(([key, prop]) => { + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.required = objRequired.includes(key); + if (fieldInfo.required) { + requiredFields.push(key); + } + fields.push(fieldInfo); + }); + } else if (schema.anyOf) { + // Handle other anyOf structures (like wait which can be number or boolean) + const objectOption = schema.anyOf.find((opt) => opt.type === 'object'); + if (objectOption && objectOption.properties) { + const objRequired = objectOption.required || []; + Object.entries(objectOption.properties).forEach(([key, prop]) => { + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.required = objRequired.includes(key); + if (fieldInfo.required) { + requiredFields.push(key); + } + fields.push(fieldInfo); + }); + } else { + // Handle primitive anyOf (number|boolean for wait) + fields.push({ + name: '_value', + type: schema.anyOf.map((opt) => opt.type).filter(Boolean).join('|'), + description: schema.description || '', + required: true, + anyOf: schema.anyOf, + }); + } + } + + return { fields, requiredFields }; +} + +/** + * Get spec-level fields from the spec schema + * @returns {Object} { fields: FieldInfo[], requiredFields: string[] } + */ +export function getSpecFields() { + const schema = schemas.spec_v3; + const fields = []; + const requiredFields = schema.required || []; + + if (schema.properties) { + Object.entries(schema.properties).forEach(([key, prop]) => { + // Skip $schema as it's auto-generated + if (key === '$schema') return; + // Skip tests as they're managed separately + if (key === 'tests') return; + + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.required = requiredFields.includes(key); + fields.push(fieldInfo); + }); + } + + return { fields, requiredFields }; +} + +/** + * Get test-level fields from the test schema + * @returns {Object} { fields: FieldInfo[], requiredFields: string[] } + */ +export function getTestFields() { + const schema = schemas.test_v3; + const fields = []; + const requiredFields = schema.required || []; + + if (schema.properties) { + Object.entries(schema.properties).forEach(([key, prop]) => { + // Skip steps as they're managed separately + if (key === 'steps') return; + + const fieldInfo = extractFieldInfo(prop, key); + fieldInfo.required = requiredFields.includes(key); + fields.push(fieldInfo); + }); + } + + return { fields, requiredFields }; +} + +/** + * Validate a step object against its schema + * @param {Object} step - The step object to validate + * @returns {{ valid: boolean, errors: string, object: Object }} + */ +export function validateStep(step) { + return validate({ + schemaKey: 'step_v3', + object: step, + addDefaults: true, + }); +} + +/** + * Validate a test object against its schema + * @param {Object} test - The test object to validate + * @returns {{ valid: boolean, errors: string, object: Object }} + */ +export function validateTest(test) { + return validate({ + schemaKey: 'test_v3', + object: test, + addDefaults: true, + }); +} + +/** + * Validate a spec object against its schema + * @param {Object} spec - The spec object to validate + * @returns {{ valid: boolean, errors: string, object: Object }} + */ +export function validateSpec(spec) { + return validate({ + schemaKey: 'spec_v3', + object: spec, + addDefaults: true, + }); +} + +/** + * Validate a value against a regex pattern + * @param {string} value - The value to validate + * @param {string} pattern - The regex pattern + * @returns {boolean} Whether the value matches the pattern + */ +export function validatePattern(value, pattern) { + if (!pattern || !value) return true; + try { + const regex = new RegExp(pattern); + return regex.test(value); + } catch { + return true; // Invalid regex pattern, skip validation + } +} + +/** + * Get a human-readable description for a pattern + * @param {string} pattern - The regex pattern + * @returns {string} Human-readable description + */ +export function describePattern(pattern) { + if (!pattern) return ''; + + // Common patterns + const patterns = { + '(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)': 'Must start with http://, https://, or / (or be a $VARIABLE)', + '(^(http://|https://).*|\\$[A-Za-z0-9_]+)': 'Must start with http:// or https:// (or be a $VARIABLE)', + '([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)': 'Must end with .png or .PNG (or be a $VARIABLE)', + '([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)': 'Must end with .mp4, .webm, or .gif (or be a $VARIABLE)', + '^[A-Za-z0-9_]+$': 'Only letters, numbers, and underscores allowed', + }; + + return patterns[pattern] || `Must match pattern: ${pattern}`; +} + +/** + * Get step type description and examples + * @param {string} stepType - The step type + * @returns {{ description: string, examples: any[] }} + */ +export function getStepTypeInfo(stepType) { + const schema = getStepTypeSchema(stepType); + if (!schema) { + return { description: '', examples: [] }; + } + + return { + description: schema.description || schema.title || stepType, + examples: schema.examples || [], + }; +} + +/** + * Create a default step object for a step type + * @param {string} stepType - The step type + * @returns {Object} Default step object + */ +export function createDefaultStep(stepType) { + const { fields, requiredFields } = getStepTypeFields(stepType); + const step = {}; + + // Check if this step type supports simple form + const formTypeField = fields.find((f) => f.name === '_formType'); + if (formTypeField) { + // Default to simple form + const simpleField = fields.find((f) => f.formType === 'simple'); + if (simpleField && simpleField.default !== undefined) { + step[stepType] = simpleField.default; + } else { + step[stepType] = ''; + } + } else { + // Object form + const stepValue = {}; + fields.forEach((field) => { + if (field.required && field.default !== undefined) { + stepValue[field.name] = field.default; + } else if (field.required) { + // Set empty defaults for required fields + if (field.type === 'string' || field.type?.includes('string')) { + stepValue[field.name] = ''; + } else if (field.type === 'number' || field.type === 'integer') { + stepValue[field.name] = 0; + } else if (field.type === 'boolean') { + stepValue[field.name] = false; + } else if (field.type === 'array') { + stepValue[field.name] = []; + } else if (field.type === 'object') { + stepValue[field.name] = {}; + } + } + }); + + if (Object.keys(stepValue).length > 0) { + step[stepType] = stepValue; + } else { + step[stepType] = {}; + } + } + + return step; +} + +/** + * Create a default test object + * @returns {Object} Default test object + */ +export function createDefaultTest() { + return { + testId: '', + description: '', + steps: [], + }; +} + +/** + * Create a default spec object + * @param {string} specId - The spec ID/name + * @returns {Object} Default spec object + */ +export function createDefaultSpec(specId = '') { + return { + specId: specId, + description: '', + tests: [], + }; +} + +export default { + getStepTypes, + getStepTypeSchema, + getCommonStepProperties, + getStepTypeVariants, + getFieldVariants, + detectVariantIndex, + extractFieldInfo, + getStepTypeFields, + getSpecFields, + getTestFields, + validateStep, + validateTest, + validateSpec, + validatePattern, + describePattern, + getStepTypeInfo, + createDefaultStep, + createDefaultTest, + createDefaultSpec, +}; diff --git a/src/cli/runner.js b/src/cli/runner.js new file mode 100644 index 0000000..09f1cc9 --- /dev/null +++ b/src/cli/runner.js @@ -0,0 +1,96 @@ +const { render } = require('ink'); +const React = require('react'); +const App = require('./App'); +const { runTests } = require('doc-detective-core'); + +/** + * Run tests with Ink-based CLI UI + * @param {Object} config - Configuration object + * @param {Object} options - Additional options like resolvedTests + * @returns {Promise} Test results + */ +async function runWithUI(config, options = {}) { + let appInstance; + let updateState; + + // Create a promise that resolves when the app is mounted + const mountPromise = new Promise((resolve) => { + const AppWrapper = () => { + const [state, setState] = React.useState({ + phase: 'initializing', + results: null, + error: null, + currentSpec: null, + currentTest: null, + progress: { + specs: { current: 0, total: 0 }, + tests: { current: 0, total: 0 }, + steps: { current: 0, total: 0 }, + }, + }); + + // Store the state updater for external use + React.useEffect(() => { + updateState = setState; + resolve(); + }, []); + + return React.createElement(App, { + config, + resolvedTests: options.resolvedTests, + state, + }); + }; + + appInstance = render(React.createElement(AppWrapper)); + }); + + // Wait for the app to mount + await mountPromise; + + try { + // Update to running phase + updateState((prev) => ({ ...prev, phase: 'running' })); + + // Run tests + const results = options.resolvedTests + ? await runTests(config, { resolvedTests: options.resolvedTests }) + : await runTests(config); + + // Update to completed phase with results + updateState((prev) => ({ + ...prev, + phase: 'completed', + results, + })); + + // Wait a bit to show the results before unmounting + await new Promise((resolve) => setTimeout(resolve, 100)); + + // Unmount the app + if (appInstance) { + appInstance.unmount(); + } + + return results; + } catch (error) { + // Update to error phase + updateState((prev) => ({ + ...prev, + phase: 'error', + error: error.message, + })); + + // Wait a bit to show the error before unmounting + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // Unmount the app + if (appInstance) { + appInstance.unmount(); + } + + throw error; + } +} + +module.exports = { runWithUI }; diff --git a/src/index.js b/src/index.js index 7d1b67f..c4e8018 100755 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,21 @@ #!/usr/bin/env node -const { runTests, runCoverage } = require("doc-detective-core"); -const { setArgs, setConfig, outputResults, setMeta, getVersionData, log } = require("./utils"); +const { + setArgs, + setConfig, + outputResults, + setMeta, + getVersionData, + log, + getResolvedTestsFromEnv, + reportResults, +} = require("./utils"); const { argv } = require("node:process"); const path = require("path"); const fs = require("fs"); +const { validate } = require("doc-detective-common"); +const { detectTests } = require("doc-detective-resolver"); +const yaml = require("js-yaml"); // Run setMeta(); @@ -12,6 +23,99 @@ main(argv); // Run async function main(argv) { + // Check for --editor flag first (before processing other args) + const rawArgs = argv.slice(2); // Remove 'node' and script path + if (rawArgs.includes('--editor') || rawArgs.includes('-e')) { + // Parse editor-specific options + const outputDir = process.cwd(); + + // Extract input file paths from args (everything that's not a flag or flag value) + const inputPaths = []; + for (let i = 0; i < rawArgs.length; i++) { + const arg = rawArgs[i]; + // Skip flags and their values + if (arg === '--editor' || arg === '-e') continue; + if (arg === '--input' || arg === '-i') { + // Next arg is the input value + if (i + 1 < rawArgs.length) { + const inputValue = rawArgs[i + 1]; + // Handle comma-separated inputs + inputValue.split(',').forEach(f => { + const trimmed = f.trim(); + if (trimmed) inputPaths.push(path.resolve(trimmed)); + }); + i++; // Skip the value + } + continue; + } + // Handle --input=value format + if (arg.startsWith('--input=') || arg.startsWith('-i=')) { + const inputValue = arg.split('=')[1]; + inputValue.split(',').forEach(f => { + const trimmed = f.trim(); + if (trimmed) inputPaths.push(path.resolve(trimmed)); + }); + continue; + } + // Skip other flags + if (arg.startsWith('-')) continue; + // Assume it's an input path if it exists + const resolved = path.resolve(arg); + if (fs.existsSync(resolved)) { + inputPaths.push(resolved); + } + } + + // Use doc-detective-resolver to detect specs from input paths + const specs = []; + + if (inputPaths.length > 0) { + // Build config for resolver with all input paths + const resolverConfig = { + input: inputPaths, + logLevel: 'silent', // Suppress resolver logging for editor mode + }; + + try { + const detectedSpecs = await detectTests({ config: resolverConfig }); + + if (detectedSpecs && detectedSpecs.length > 0) { + // Convert detected specs to the format expected by the builder + for (const detectedSpec of detectedSpecs) { + const filePath = detectedSpec.contentPath || null; + const ext = filePath ? path.extname(filePath).toLowerCase() : '.json'; + + // detectedSpec is already a valid spec_v3 object from detectTests + const spec = { ...detectedSpec }; + + specs.push({ + spec, + filePath, + extension: ext, + isValid: true, // detectTests only returns valid specs + validationErrors: null, + }); + } + } + } catch (err) { + console.error(`\x1b[31mError detecting specs: ${err.message}\x1b[0m`); + } + + // If input paths were specified but no specs were detected, exit with error + if (specs.length === 0) { + console.error('\x1b[31mError: No valid spec files could be detected from the provided inputs.\x1b[0m'); + process.exit(1); + } + } + + // Dynamically import the builder to avoid ESM issues at startup + const { runBuilder } = require("./cli/builder"); + + // Run the interactive builder with loaded specs + await runBuilder({ outputDir, specs }); + return; + } + // Find index of `doc-detective` or `run` in argv const index = argv.findIndex( (arg) => arg.endsWith("doc-detective") || arg.endsWith("index.js") @@ -36,16 +140,31 @@ async function main(argv) { // Set config const config = await setConfig({ configPath: configPath, args: argv }); - if (config.logLevel === "debug") { - console.log(`CLI:VERSION INFO:\n${JSON.stringify(getVersionData(), null, 2)}`); - console.log(`CLI:CONFIG:\n${JSON.stringify(config, null, 2)}`); - } + log( + `CLI:VERSION INFO:\n${JSON.stringify(getVersionData(), null, 2)}`, + "debug", + config + ); + log(`CLI:CONFIG:\n${JSON.stringify(config, null, 2)}`, "debug", config); - // Run tests - const output = config.output; - const results = await runTests(config); + // Check for DOC_DETECTIVE_API environment variable + let api = await getResolvedTestsFromEnv(config); + let resolvedTests = api?.resolvedTests || null; + let apiConfig = api?.apiConfig || null; - // Output results - await outputResults(config, output, results, { command: "runTests" }); + // Run tests with the new Ink-based UI + // Dynamically import to avoid ESM issues at startup + const { runWithUI } = require("./cli/runner"); + const output = config.output; + const results = await runWithUI(config, { resolvedTests }); -} \ No newline at end of file + if (apiConfig) { + await reportResults({ apiConfig, results }); + } else { + // Output results to JSON file only (terminal output is handled by Ink UI) + await outputResults(config, output, results, { + command: "runTests", + reporters: ["json"] // Only use JSON reporter, not terminal reporter + }); + } +} diff --git a/src/utils.js b/src/utils.js index c9b7650..0be6178 100644 --- a/src/utils.js +++ b/src/utils.js @@ -5,6 +5,7 @@ const path = require("path"); const fs = require("fs"); const { spawn } = require("child_process"); const os = require("os"); +const axios = require("axios"); exports.setArgs = setArgs; exports.setConfig = setConfig; @@ -12,6 +13,26 @@ exports.outputResults = outputResults; exports.spawnCommand = spawnCommand; exports.setMeta = setMeta; exports.getVersionData = getVersionData; +exports.log = log; +exports.getResolvedTestsFromEnv = getResolvedTestsFromEnv; +exports.reportResults = reportResults; + +// Log function that respects logLevel +function log(message, level = "info", config = {}) { + const logLevels = ["silent", "error", "warning", "info", "debug"]; + const currentLevel = config.logLevel || "info"; + const currentLevelIndex = logLevels.indexOf(currentLevel); + const messageLevelIndex = logLevels.indexOf(level); + + // Only log if the message level is at or above the current log level + if (currentLevelIndex >= messageLevelIndex && messageLevelIndex > 0) { + if (level === "error") { + console.error(message); + } else { + console.log(message); + } + } +} // Define args function setArgs(args) { @@ -50,6 +71,116 @@ function setArgs(args) { return argv; } +// Get resolved tests from environment variable, if set +async function getResolvedTestsFromEnv(config = {}) { + if (!process.env.DOC_DETECTIVE_API) { + return null; + } + + let resolvedTests = null; + let apiConfig = null; + try { + // Parse the environment variable as JSON + apiConfig = JSON.parse(process.env.DOC_DETECTIVE_API); + + // Validate the structure: { accountId, url, token, contextIds } + if (!apiConfig.accountId || !apiConfig.url || !apiConfig.token || !apiConfig.contextIds) { + log( + "Invalid DOC_DETECTIVE_API: must contain 'accountId', 'url', 'token', and 'contextIds' properties", + "error", + config + ); + process.exit(1); + } + + log(`CLI:Fetching resolved tests from ${apiConfig.url}/resolved-tests`, "debug", config); + + // Make GET request to the specified URL with token in header + const response = await axios.get(`${apiConfig.url}/resolved-tests`, { + headers: { + "x-runner-token": apiConfig.token, + }, + }); + + // The response is the resolvedTests + resolvedTests = response.data; + + // Validate against resolvedTests_v3 schema + const validation = validate({ + schemaKey: "resolvedTests_v3", + object: resolvedTests, + }); + + if (!validation.valid) { + log( + "Invalid resolvedTests from API response. " + validation.errors, + "error", + config + ); + process.exit(1); + } + + // Get config from environment variable for merging + const envConfig = await getConfigFromEnv(); + if (envConfig) { + // Apply config overrides to resolvedTests.config + if (resolvedTests.config) { + resolvedTests.config = { ...resolvedTests.config, ...envConfig }; + } else { + resolvedTests.config = envConfig; + } + } + + log( + `CLI:RESOLVED_TESTS:\n${JSON.stringify(resolvedTests, null, 2)}`, + "debug", + config + ); + } catch (error) { + log( + `Error fetching resolved tests from DOC_DETECTIVE_API: ${error.message}`, + "error", + config + ); + process.exit(1); + } + return { apiConfig, resolvedTests }; +} + +async function getConfigFromEnv() { + if (!process.env.DOC_DETECTIVE_CONFIG) { + return null; + } + + let envConfig = null; + try { + // Parse the environment variable as JSON + envConfig = JSON.parse(process.env.DOC_DETECTIVE_CONFIG); + + // Validate the environment variable config + const envValidation = validate({ + schemaKey: "config_v3", + object: envConfig, + }); + + if (!envValidation.valid) { + console.error( + "Invalid config from DOC_DETECTIVE_CONFIG environment variable.", + envValidation.errors + ); + process.exit(1); + } + + log(`CLI:ENV_CONFIG:\n${JSON.stringify(envConfig, null, 2)}`, "debug", envConfig); + } catch (error) { + console.error( + `Error parsing DOC_DETECTIVE_CONFIG environment variable: ${error.message}` + ); + process.exit(1); + } + return envConfig; +} + // Override config values based on args and validate the config async function setConfig({ configPath, args }) { if (args.config && !configPath) { @@ -67,6 +198,13 @@ async function setConfig({ configPath, args }) { } } + // Check for DOC_DETECTIVE_CONFIG environment variable + const envConfig = await getConfigFromEnv(); + if (envConfig) { + // Merge with file config, preferring environment variable config (use raw envConfig, not validated with defaults) + config = { ...config, ...envConfig }; + } + // Validate config const validation = validate({ schemaKey: "config_v3", @@ -85,10 +223,10 @@ async function setConfig({ configPath, args }) { ...config, input: config.input || ".", output: config.output || ".", - recursive: config.recursive || true, + recursive: config.recursive ?? true, relativePathBase: config.relativePathBase || "file", loadVariables: config.loadVariables || ".env", - detectSteps: config.detectSteps || true, + detectSteps: config.detectSteps ?? true, logLevel: config.logLevel || "info", fileTypes: config.fileTypes || ["markdown", "asciidoc", "html"], telemetry: config.telemetry || { send: true }, @@ -588,6 +726,70 @@ function registerReporter(name, reporterFunction) { // Export the registerReporter function exports.registerReporter = registerReporter; +async function reportResults({ apiConfig, results }) { + // Transform results into the required format for the API + // Extract contexts from the nested structure and format them + const contexts = []; + + if (results.specs) { + results.specs.forEach((spec) => { + if (spec.tests) { + spec.tests.forEach((test) => { + if (test.contexts) { + test.contexts.forEach((context) => { + // Extract or generate contextId + const contextId = + context.contextId; + + // Convert result status to lowercase (PASS -> passed, FAIL -> failed, etc.) + let status; + if (context.result === "PASS") { + status = "passed"; + } else if (context.result === "FAIL") { + status = "failed"; + } else if (context.result === "WARNING") { + status = "warning"; + } else if (context.result === "SKIPPED") { + status = "skipped"; + } + if (!status) { + log(config, "error", `Unknown context result status for context ID ${contextId}`); + return; + } + + // Build the context payload with the entire context object embedded + contexts.push({ + contextId: contextId, + status: status, + result: context, + }); + }); + } + }); + } + }); + } + + // POST to the /contexts endpoint + try { + const url = `${apiConfig.url}/contexts`; + const payload = { contexts }; + + console.log(payload); + + const response = await axios.post(url, payload, { + headers: { + "x-runner-token": apiConfig.token, + }, + }); + console.log("Results reported successfully:", response.data); + } catch (error) { + console.error( + `Error reporting results to ${apiConfig.url}/contexts: ${error.message}` + ); + } +} + async function outputResults(config = {}, outputPath, results, options = {}) { // Default to using both built-in reporters if none specified const defaultReporters = ["terminal", "json"]; @@ -653,7 +855,9 @@ async function spawnCommand(cmd, args) { } } - const runCommand = spawn(cmd, args); + const runCommand = spawn(cmd, args, { + env: process.env, // Explicitly pass environment variables + }); // Capture stdout let stdout = ""; diff --git a/test/resolvedTests.test.js b/test/resolvedTests.test.js new file mode 100644 index 0000000..2e2a882 --- /dev/null +++ b/test/resolvedTests.test.js @@ -0,0 +1,193 @@ +const { createServer } = require("./server"); +const path = require("path"); +const { spawnCommand } = require("../src/utils"); +const assert = require("assert").strict; +const fs = require("fs"); +const artifactPath = path.resolve(__dirname, "./artifacts"); +const outputFile = path.resolve(`${artifactPath}/resolvedTestsResults.json`); + +// Create a server with custom options +const server = createServer({ + port: 8093, + staticDir: "./test/server/public", +}); + +// Start the server before tests +before(async () => { + try { + await server.start(); + } catch (error) { + console.error(`Failed to start test server: ${error.message}`); + throw error; + } +}); + +// Stop the server after tests +after(async () => { + try { + await server.stop(); + } catch (error) { + console.error(`Failed to stop test server: ${error.message}`); + } +}); + +describe("DOC_DETECTIVE_API environment variable", function () { + // Set indefinite timeout + this.timeout(0); + + it("Should fetch and run resolved tests from API", async () => { + const apiConfig = { + accountId: "test-account", + url: "http://localhost:8093/api/resolved-tests", + token: "test-token-123", + contextIds: "test-context", + }; + + // Set environment variable + const originalEnv = process.env.DOC_DETECTIVE_API; + process.env.DOC_DETECTIVE_API = JSON.stringify(apiConfig); + + try { + const result = await spawnCommand( + `node ./src/index.js -o ${outputFile}` + ); + + // Wait until the file is written + let waitCount = 0; + while (!fs.existsSync(outputFile) && waitCount < 50) { + await new Promise((resolve) => setTimeout(resolve, 100)); + waitCount++; + } + + if (fs.existsSync(outputFile)) { + const testResult = require(outputFile); + console.log( + "API Result summary:", + JSON.stringify(testResult.summary, null, 2) + ); + // Clean up the require cache + delete require.cache[require.resolve(outputFile)]; + fs.unlinkSync(outputFile); + + // Check that tests were run + assert.ok(testResult.summary); + assert.ok(testResult.specs); + } + } finally { + // Restore original env + if (originalEnv !== undefined) { + process.env.DOC_DETECTIVE_API = originalEnv; + } else { + delete process.env.DOC_DETECTIVE_API; + } + } + }); + + it("Should reject API config without required fields", async () => { + const invalidApiConfig = { + accountId: "test-account", + // Missing url and token + }; + + const originalEnv = process.env.DOC_DETECTIVE_API; + process.env.DOC_DETECTIVE_API = JSON.stringify(invalidApiConfig); + + try { + const result = await spawnCommand( + `node ./src/index.js -o ${outputFile}` + ); + + // Should exit with non-zero code + assert.notEqual(result.exitCode, 0); + } finally { + // Restore original env + if (originalEnv !== undefined) { + process.env.DOC_DETECTIVE_API = originalEnv; + } else { + delete process.env.DOC_DETECTIVE_API; + } + } + }); + + it("Should reject unauthorized API requests", async () => { + const apiConfigBadToken = { + accountId: "test-account", + url: "http://localhost:8093/api/resolved-tests", + token: "wrong-token", + contextIds: "test-context", + }; + + const originalEnv = process.env.DOC_DETECTIVE_API; + process.env.DOC_DETECTIVE_API = JSON.stringify(apiConfigBadToken); + + try { + const result = await spawnCommand( + `node ./src/index.js -o ${outputFile}` + ); + + // Should exit with non-zero code due to 401 response + assert.notEqual(result.exitCode, 0); + } finally { + // Restore original env + if (originalEnv !== undefined) { + process.env.DOC_DETECTIVE_API = originalEnv; + } else { + delete process.env.DOC_DETECTIVE_API; + } + } + }); + + it("Should apply config overrides from DOC_DETECTIVE_CONFIG to API-fetched tests", async () => { + const apiConfig = { + accountId: "test-account", + url: "http://localhost:8093/api/resolved-tests", + token: "test-token-123", + contextIds: "test-context", + }; + + const configOverride = { + logLevel: "debug", + }; + + const originalApiEnv = process.env.DOC_DETECTIVE_API; + const originalConfigEnv = process.env.DOC_DETECTIVE_CONFIG; + process.env.DOC_DETECTIVE_API = JSON.stringify(apiConfig); + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify(configOverride); + + try { + await spawnCommand( + `node ./src/index.js -o ${outputFile}` + ); + + // Wait until the file is written + let waitCount = 0; + while (!fs.existsSync(outputFile) && waitCount < 50) { + await new Promise((resolve) => setTimeout(resolve, 100)); + waitCount++; + } + + if (fs.existsSync(outputFile)) { + const testResult = require(outputFile); + // Clean up the require cache + delete require.cache[require.resolve(outputFile)]; + fs.unlinkSync(outputFile); + + // Check that tests were run + assert.ok(testResult.summary); + assert.ok(testResult.specs); + } + } finally { + // Restore original env + if (originalApiEnv !== undefined) { + process.env.DOC_DETECTIVE_API = originalApiEnv; + } else { + delete process.env.DOC_DETECTIVE_API; + } + if (originalConfigEnv !== undefined) { + process.env.DOC_DETECTIVE_CONFIG = originalConfigEnv; + } else { + delete process.env.DOC_DETECTIVE_CONFIG; + } + } + }); +}); diff --git a/test/server/index.js b/test/server/index.js index 83c8a8d..9a78d3b 100644 --- a/test/server/index.js +++ b/test/server/index.js @@ -54,6 +54,52 @@ function createServer(options = {}) { } }); + // Endpoint for testing DOC_DETECTIVE_API - returns resolved tests + app.get("/api/resolved-tests", (req, res) => { + try { + // Check for x-runner-token header + const token = req.headers['x-runner-token']; + + if (!token || token !== 'test-token-123') { + return res.status(401).json({ error: "Unauthorized" }); + } + + // Return a valid resolvedTests object + const resolvedTests = { + "resolvedTestsId": "api-resolved-tests-id", + "config": { + "logLevel": "info" + }, + "specs": [ + { + "specId": "api-spec", + "tests": [ + { + "testId": "api-test", + "contexts": [ + { + "contextId": "api-context", + "steps": [ + { + "stepId": "step-1", + "checkLink": `http://localhost:${port}` + } + ] + } + ] + } + ] + } + ] + }; + + res.json(resolvedTests); + } catch (error) { + console.error("Error processing resolved tests request:", error); + res.status(500).json({ error: "Internal server error" }); + } + }); + return { /** * Start the server @@ -85,7 +131,7 @@ function createServer(options = {}) { * @returns {Promise} Promise that resolves when server is stopped */ stop: () => { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { if (server) { server.close((error) => { if (error) { diff --git a/test/utils.test.js b/test/utils.test.js index 08218dd..bc58a73 100644 --- a/test/utils.test.js +++ b/test/utils.test.js @@ -83,7 +83,7 @@ describe("Util tests", function () { it("Config overrides are set correctly", async function () { // This test takes a bit longer this.timeout(5000); - + configSets = [ { // Input override @@ -100,7 +100,10 @@ describe("Util tests", function () { "--logLevel", "debug", ], - expected: { input: [path.resolve(process.cwd(), "input.spec.json")], logLevel: "debug" }, + expected: { + input: [path.resolve(process.cwd(), "input.spec.json")], + logLevel: "debug", + }, }, { // Input, logLevel, and setup overrides @@ -153,7 +156,10 @@ describe("Util tests", function () { "input.spec.json,anotherInput.spec.json", ], expected: { - input: [path.resolve(process.cwd(), "input.spec.json"), path.resolve(process.cwd(), "anotherInput.spec.json")], + input: [ + path.resolve(process.cwd(), "input.spec.json"), + path.resolve(process.cwd(), "anotherInput.spec.json"), + ], output: process.cwd(), recursive: true, }, @@ -171,22 +177,28 @@ describe("Util tests", function () { input: [path.resolve(process.cwd(), "input.spec.json")], allowUnsafeSteps: true, }, - } + }, ]; // Use process.stdout.write directly to force console output during tests - console.log('\n===== CONFIG TEST RESULTS =====\n'); - + console.log("\n===== CONFIG TEST RESULTS =====\n"); + // Use Promise.all with map instead of forEach to properly handle async operations - await Promise.all(configSets.map(async (configSet, index) => { - // Set config with the args - console.log(`Config test ${index}: ${JSON.stringify(configSet, null, 2)}`); - const configResult = await setConfig({ args: setArgs(configSet.args) }); - console.log(`Config result ${index}: ${JSON.stringify(configResult, null, 2)}\n`); - // Deeply compare the config result with the expected result - deepObjectExpect(configResult, configSet.expected); - })); - process.stdout.write('===== END CONFIG TEST RESULTS =====\n'); + await Promise.all( + configSets.map(async (configSet, index) => { + // Set config with the args + console.log( + `Config test ${index}: ${JSON.stringify(configSet, null, 2)}` + ); + const configResult = await setConfig({ args: setArgs(configSet.args) }); + console.log( + `Config result ${index}: ${JSON.stringify(configResult, null, 2)}\n` + ); + // Deeply compare the config result with the expected result + deepObjectExpect(configResult, configSet.expected); + }) + ); + process.stdout.write("===== END CONFIG TEST RESULTS =====\n"); }); // Test that results output correctly. @@ -204,6 +216,377 @@ describe("Util tests", function () { // Clean up fs.unlinkSync(outputResultsPath); }); + + // Test environment variable config detection + it("Config from DOC_DETECTIVE_CONFIG environment variable is loaded and merged", async function () { + this.timeout(5000); + + // Save the original environment variable value + const originalEnvConfig = process.env.DOC_DETECTIVE_CONFIG; + + try { + // Ensure env override is not set for the default-value test + delete process.env.DOC_DETECTIVE_CONFIG; + + // Test 1: Valid environment variable config without file config + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + logLevel: "debug", + }); + + const config1 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config1.logLevel).to.equal("debug"); + + // Test 2: Environment variable config merged with file config (env var takes precedence) + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + logLevel: "error", + }); + + const config2 = await setConfig({ + configPath: "./test/test-config.json", + args: setArgs([ + "node", + "runTests.js", + "--config", + "./test/test-config.json", + ]), + }); + // Environment variable should override file config + expect(config2.logLevel).to.equal("error"); + // Check that other values from file config are preserved + expect(config2.telemetry.send).to.equal(false); + + // Test 3: Environment variable config with command line args (args take precedence) + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + logLevel: "warning", + input: "env-input.json", + }); + + const config3 = await setConfig({ + args: setArgs([ + "node", + "runTests.js", + "--input", + "cli-input.json", + "--logLevel", + "debug", + ]), + }); + // Command line args should override environment variable + expect(config3.logLevel).to.equal("debug"); + expect(config3.input).to.deep.equal([ + path.resolve(process.cwd(), "cli-input.json"), + ]); + } finally { + // Restore the original environment variable value + if (originalEnvConfig !== undefined) { + process.env.DOC_DETECTIVE_CONFIG = originalEnvConfig; + } else { + delete process.env.DOC_DETECTIVE_CONFIG; + } + } + }); + + // Test that false values for recursive and detectSteps are preserved + it("Preserves false values for recursive and detectSteps config properties", async function () { + this.timeout(5000); + + // Save original environment variable + const originalEnvConfig = process.env.DOC_DETECTIVE_CONFIG; + + try { + // Test 1: Default values when not specified (should be true) + const config1 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config1.recursive).to.equal( + true, + "recursive should default to true" + ); + expect(config1.detectSteps).to.equal( + true, + "detectSteps should default to true" + ); + + // Test 2: Explicitly set to false in environment variable + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + recursive: false, + detectSteps: false, + }); + + const config2 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config2.recursive).to.equal( + false, + "recursive should be false from env var" + ); + expect(config2.detectSteps).to.equal( + false, + "detectSteps should be false from env var" + ); + + // Test 3: Explicitly set to true in environment variable + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + recursive: true, + detectSteps: true, + }); + + const config3 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config3.recursive).to.equal( + true, + "recursive should be true from env var" + ); + expect(config3.detectSteps).to.equal( + true, + "detectSteps should be true from env var" + ); + + // Test 4: Only one set to false + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + recursive: false, + }); + + const config4 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config4.recursive).to.equal( + false, + "recursive should be false from env var" + ); + expect(config4.detectSteps).to.equal( + true, + "detectSteps should default to true" + ); + + // Test 5: Only detectSteps set to false + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + detectSteps: false, + }); + + const config5 = await setConfig({ + args: setArgs(["node", "runTests.js"]), + }); + expect(config5.recursive).to.equal( + true, + "recursive should default to true" + ); + expect(config5.detectSteps).to.equal( + false, + "detectSteps should be false from env var" + ); + } finally { + // Restore the original environment variable value + if (originalEnvConfig !== undefined) { + process.env.DOC_DETECTIVE_CONFIG = originalEnvConfig; + } else { + delete process.env.DOC_DETECTIVE_CONFIG; + } + } + }); + + // Test that false values from config file are preserved + it("Preserves false values for recursive and detectSteps from config file", async function () { + this.timeout(5000); + + const testConfigDir = path.resolve("./test"); + + // Create temporary config files for testing + const configWithFalseValues = path.join( + testConfigDir, + "test-config-false-values.json" + ); + const configWithTrueValues = path.join( + testConfigDir, + "test-config-true-values.json" + ); + const configWithMixedValues = path.join( + testConfigDir, + "test-config-mixed-values.json" + ); + + try { + // Create config file with both set to false + fs.writeFileSync( + configWithFalseValues, + JSON.stringify( + { + recursive: false, + detectSteps: false, + logLevel: "silent", + }, + null, + 2 + ) + ); + + // Create config file with both set to true + fs.writeFileSync( + configWithTrueValues, + JSON.stringify( + { + recursive: true, + detectSteps: true, + logLevel: "silent", + }, + null, + 2 + ) + ); + + // Create config file with mixed values + fs.writeFileSync( + configWithMixedValues, + JSON.stringify( + { + recursive: false, + detectSteps: true, + logLevel: "silent", + }, + null, + 2 + ) + ); + + // Test 1: Config file with false values + const config1 = await setConfig({ + configPath: configWithFalseValues, + args: setArgs([ + "node", + "runTests.js", + "--config", + configWithFalseValues, + ]), + }); + expect(config1.recursive).to.equal( + false, + "recursive should be false from config file" + ); + expect(config1.detectSteps).to.equal( + false, + "detectSteps should be false from config file" + ); + + // Test 2: Config file with true values + const config2 = await setConfig({ + configPath: configWithTrueValues, + args: setArgs([ + "node", + "runTests.js", + "--config", + configWithTrueValues, + ]), + }); + expect(config2.recursive).to.equal( + true, + "recursive should be true from config file" + ); + expect(config2.detectSteps).to.equal( + true, + "detectSteps should be true from config file" + ); + + // Test 3: Config file with mixed values + const config3 = await setConfig({ + configPath: configWithMixedValues, + args: setArgs([ + "node", + "runTests.js", + "--config", + configWithMixedValues, + ]), + }); + expect(config3.recursive).to.equal( + false, + "recursive should be false from config file" + ); + expect(config3.detectSteps).to.equal( + true, + "detectSteps should be true from config file" + ); + } finally { + // Clean up temporary config files + if (fs.existsSync(configWithFalseValues)) { + fs.unlinkSync(configWithFalseValues); + } + if (fs.existsSync(configWithTrueValues)) { + fs.unlinkSync(configWithTrueValues); + } + if (fs.existsSync(configWithMixedValues)) { + fs.unlinkSync(configWithMixedValues); + } + } + }); + + // Test that environment variable overrides config file for recursive and detectSteps + it("Environment variable overrides config file for recursive and detectSteps", async function () { + this.timeout(5000); + + const testConfigDir = path.resolve("./test"); + const testConfigPath = path.join( + testConfigDir, + "test-config-override.json" + ); + + // Save original environment variable + const originalEnvConfig = process.env.DOC_DETECTIVE_CONFIG; + + try { + // Create config file with true values + fs.writeFileSync( + testConfigPath, + JSON.stringify( + { + recursive: true, + detectSteps: true, + logLevel: "silent", + }, + null, + 2 + ) + ); + + // Set environment variable with false values + process.env.DOC_DETECTIVE_CONFIG = JSON.stringify({ + recursive: false, + detectSteps: false, + }); + + // Environment variable should override file config + const config = await setConfig({ + configPath: testConfigPath, + args: setArgs(["node", "runTests.js", "--config", testConfigPath]), + }); + + expect(config.recursive).to.equal( + false, + "recursive should be false from env var (overriding config file)" + ); + expect(config.detectSteps).to.equal( + false, + "detectSteps should be false from env var (overriding config file)" + ); + expect(config.logLevel).to.equal( + "silent", + "logLevel should be preserved from config file" + ); + } finally { + // Clean up + if (fs.existsSync(testConfigPath)) { + fs.unlinkSync(testConfigPath); + } + + // Restore the original environment variable value + if (originalEnvConfig !== undefined) { + process.env.DOC_DETECTIVE_CONFIG = originalEnvConfig; + } else { + delete process.env.DOC_DETECTIVE_CONFIG; + } + } + }); }); // Deeply compares two objects @@ -212,15 +595,21 @@ function deepObjectExpect(actual, expected) { Object.entries(expected).forEach(([key, value]) => { // Make sure the property exists in actual expect(actual).to.have.property(key); - + // If value is null, check directly if (value === null) { expect(actual[key]).to.equal(null); } // If value is an array, check each item else if (Array.isArray(value)) { - expect(Array.isArray(actual[key])).to.equal(true, `Expected ${key} to be an array. Expected: ${expected[key]}. Actual: ${actual[key]}.`); - expect(actual[key].length).to.equal(value.length, `Expected ${key} array to have length ${value.length}. Actual: ${actual[key].length}`); + expect(Array.isArray(actual[key])).to.equal( + true, + `Expected ${key} to be an array. Expected: ${expected[key]}. Actual: ${actual[key]}.` + ); + expect(actual[key].length).to.equal( + value.length, + `Expected ${key} array to have length ${value.length}. Actual: ${actual[key].length}` + ); // Check each array item value.forEach((item, index) => { @@ -234,7 +623,7 @@ function deepObjectExpect(actual, expected) { // If value is an object but not null, recursively check it else if (typeof value === "object") { deepObjectExpect(actual[key], expected[key]); - } + } // Otherwise, check that the value is correct else { const expectedObject = {}; From 4642feaaa1c3e9bf472dece51bfce2ff4f9e9873 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 5 Dec 2025 01:14:27 -0800 Subject: [PATCH 05/90] Inline test support --- cli/package-lock.json | 720 +- cli/package.json | 1 + cli/src/cli/builder/StepEditor.mjs | 15 +- cli/src/cli/builder/TestBuilder.mjs | 290 +- cli/src/cli/builder/sourceFileUtils.js | 521 + common/dist/schemas/config_v3.schema.json | 3888 ++- common/dist/schemas/report_v3.schema.json | 4060 ++- .../dist/schemas/resolvedTests_v3.schema.json | 8080 ++++- .../schemas/sourceLocation_v3.schema.json | 106 + common/dist/schemas/spec_v3.schema.json | 4060 ++- common/dist/schemas/step_v3.schema.json | 1922 +- common/dist/schemas/test_v3.schema.json | 4068 ++- common/package-lock.json | 1 + common/src/schemas/dereferenceSchemas.js | 1 + .../output_schemas/config_v3.schema.json | 3888 ++- .../output_schemas/report_v3.schema.json | 4060 ++- .../resolvedTests_v3.schema.json | 8080 ++++- .../sourceLocation_v3.schema.json | 106 + .../output_schemas/spec_v3.schema.json | 4060 ++- .../output_schemas/step_v3.schema.json | 1922 +- .../output_schemas/test_v3.schema.json | 4068 ++- common/src/schemas/schemas.json | 26366 +++++++++++++++- .../src_schemas/sourceLocation_v3.schema.json | 106 + .../schemas/src_schemas/step_v3.schema.json | 7 + .../schemas/src_schemas/test_v3.schema.json | 4 + resolver/package-lock.json | 2 + resolver/src/utils.js | 150 +- 27 files changed, 78561 insertions(+), 1991 deletions(-) create mode 100644 cli/src/cli/builder/sourceFileUtils.js create mode 100644 common/dist/schemas/sourceLocation_v3.schema.json create mode 100644 common/src/schemas/output_schemas/sourceLocation_v3.schema.json create mode 100644 common/src/schemas/src_schemas/sourceLocation_v3.schema.json diff --git a/cli/package-lock.json b/cli/package-lock.json index c107a6d..67d44e4 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1606,6 +1606,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -6199,7 +6200,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -6234,7 +6234,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -6249,7 +6248,6 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -6279,7 +6277,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -6453,7 +6450,6 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -6600,7 +6596,6 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -6616,7 +6611,6 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -6638,8 +6632,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/@xmldom/xmldom": { "version": "0.8.11", @@ -6667,7 +6660,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -6681,7 +6673,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -6727,7 +6718,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -6794,7 +6784,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -6927,8 +6916,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/appium-geckodriver/node_modules/async": { "version": "3.2.6", @@ -7038,7 +7026,6 @@ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -7060,7 +7047,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7072,7 +7058,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7093,7 +7078,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -7149,7 +7133,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -7175,7 +7158,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -7198,7 +7180,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -7243,7 +7224,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -7256,7 +7236,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -7269,7 +7248,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -7284,7 +7262,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7296,15 +7273,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -7322,7 +7297,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -7340,7 +7314,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -7350,7 +7323,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -7382,7 +7354,6 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -7395,7 +7366,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -7405,7 +7375,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -7418,7 +7387,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -7440,7 +7408,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -7466,7 +7433,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -7482,7 +7448,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -7496,7 +7461,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -7506,7 +7470,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -7516,7 +7479,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.6.0" } @@ -7592,7 +7554,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -7610,7 +7571,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -7632,7 +7592,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -7652,15 +7611,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -7695,8 +7652,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/emoji-regex": { "version": "9.2.2", @@ -7708,15 +7664,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -7780,7 +7734,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -7789,15 +7742,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -7834,7 +7785,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -7907,7 +7857,6 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -7916,15 +7865,13 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/finalhandler": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -7957,8 +7904,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/follow-redirects": { "version": "1.15.11", @@ -8050,7 +7996,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8060,7 +8005,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8114,7 +8058,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -8124,7 +8067,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8242,8 +8184,7 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/has-flag": { "version": "4.0.0", @@ -8305,7 +8246,6 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -8318,8 +8258,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -8327,7 +8266,6 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -8344,7 +8282,6 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -8354,15 +8291,13 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -8382,15 +8317,13 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -8438,7 +8371,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -8478,7 +8410,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8496,8 +8427,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/is-stream": { "version": "2.0.1", @@ -8612,7 +8542,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -8621,8 +8550,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/lazystream": { "version": "1.0.1", @@ -8671,7 +8599,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14" }, @@ -8742,7 +8669,6 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -8778,7 +8704,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8788,7 +8713,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8801,7 +8725,6 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -8817,7 +8740,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -8826,15 +8748,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8844,7 +8764,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8854,7 +8773,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -8871,7 +8789,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -8881,8 +8798,7 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/minipass": { "version": "7.1.2", @@ -8907,7 +8823,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -8924,7 +8839,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -8933,15 +8847,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -8969,7 +8881,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9009,7 +8920,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -9022,15 +8932,13 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9043,7 +8951,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9062,7 +8969,6 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", - "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -9072,7 +8978,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -9088,7 +8993,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -9112,7 +9016,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9122,7 +9025,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9165,7 +9067,6 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", - "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -9210,7 +9111,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9260,7 +9160,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -9356,7 +9255,6 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -9376,7 +9274,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -9392,7 +9289,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9402,7 +9298,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -9418,7 +9313,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9568,7 +9462,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -9582,7 +9475,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -9605,7 +9497,6 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -9614,8 +9505,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/sanitize-filename": { "version": "1.6.3", @@ -9631,8 +9521,7 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/semver": { "version": "7.7.3", @@ -9651,7 +9540,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -9674,7 +9562,6 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", - "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -9691,7 +9578,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9714,15 +9600,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -9743,8 +9627,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-geckodriver/node_modules/sharp": { "version": "0.34.5", @@ -9829,7 +9712,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -9849,7 +9731,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -9866,7 +9747,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -9885,7 +9765,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -9963,7 +9842,6 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -9981,7 +9859,6 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -9997,7 +9874,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10012,7 +9888,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -10022,7 +9897,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -10261,8 +10135,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/through": { "version": "2.3.8", @@ -10275,7 +10148,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -10285,7 +10157,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -10326,7 +10197,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", - "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -10350,7 +10220,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -10395,7 +10264,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -10406,7 +10274,6 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -10416,7 +10283,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -10441,7 +10307,6 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -10464,7 +10329,6 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -10479,7 +10343,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10494,7 +10357,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10509,7 +10371,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10586,7 +10447,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10595,15 +10455,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10618,7 +10476,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10637,7 +10494,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -10668,7 +10524,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -10678,7 +10533,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -10691,7 +10545,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -10709,7 +10562,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -10718,15 +10570,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -10815,7 +10665,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -10850,7 +10699,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -10865,7 +10713,6 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -10895,7 +10742,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -10928,7 +10774,6 @@ "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" @@ -10943,7 +10788,6 @@ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/tsconfig": "^1.1.0", @@ -10994,7 +10838,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11011,7 +10854,6 @@ "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@tsconfig/node20": "20.1.6" }, @@ -11025,7 +10867,6 @@ "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/schema": "^1.0.0", @@ -11042,7 +10883,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -11057,7 +10897,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -11067,7 +10906,6 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.1.90" } @@ -11077,7 +10915,6 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -11090,7 +10927,6 @@ "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -11101,7 +10937,6 @@ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=18" } @@ -11118,7 +10953,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11141,7 +10975,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11164,7 +10997,6 @@ "os": [ "darwin" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11181,7 +11013,6 @@ "os": [ "darwin" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11198,7 +11029,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11215,7 +11045,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11232,7 +11061,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11249,7 +11077,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11266,7 +11093,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11283,7 +11109,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11300,7 +11125,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11317,7 +11141,6 @@ "os": [ "linux" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11334,7 +11157,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11357,7 +11179,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11380,7 +11201,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11403,7 +11223,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11426,7 +11245,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11449,7 +11267,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11472,7 +11289,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11495,7 +11311,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11515,7 +11330,6 @@ ], "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, - "peer": true, "dependencies": { "@emnapi/runtime": "^1.7.0" }, @@ -11538,7 +11352,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11558,7 +11371,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11578,7 +11390,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11612,7 +11423,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -11630,7 +11440,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -11643,7 +11452,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -11662,7 +11470,6 @@ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=14" } @@ -11672,7 +11479,6 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -11688,7 +11494,6 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -11698,29 +11503,25 @@ "version": "20.1.6", "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@xmldom/xmldom": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -11730,7 +11531,6 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", - "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -11743,7 +11543,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -11757,7 +11556,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -11775,7 +11573,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -11788,7 +11585,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11805,7 +11601,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -11850,7 +11645,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11867,7 +11661,6 @@ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", @@ -11886,7 +11679,6 @@ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "license": "MIT", - "peer": true, "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", @@ -11905,7 +11697,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -11915,7 +11706,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -11936,7 +11726,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -11951,15 +11740,13 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11975,7 +11762,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -11991,22 +11777,19 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/appium-safari-driver/node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/async-lock": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/asyncbox": { "version": "3.0.0", @@ -12026,15 +11809,13 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/axios": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", - "peer": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -12046,7 +11827,6 @@ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "react-native-b4a": "*" }, @@ -12060,15 +11840,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/bare-events": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "bare-abort-controller": "*" }, @@ -12096,22 +11874,19 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/base64-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -12124,7 +11899,6 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -12134,7 +11908,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -12146,7 +11919,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12167,7 +11939,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -12188,7 +11959,6 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -12198,7 +11968,6 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -12225,7 +11994,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12236,7 +12004,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -12252,7 +12019,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -12262,7 +12028,6 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -12276,7 +12041,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -12293,7 +12057,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12310,7 +12073,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12323,7 +12085,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -12336,7 +12097,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -12349,7 +12109,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -12364,7 +12123,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12376,15 +12134,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -12402,7 +12158,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -12420,7 +12175,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -12430,7 +12184,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -12444,7 +12197,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12456,15 +12208,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/color-string": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12477,7 +12227,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12487,7 +12236,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12500,7 +12248,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12510,7 +12257,6 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", - "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -12523,7 +12269,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -12533,7 +12278,6 @@ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", @@ -12550,7 +12294,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -12566,7 +12309,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -12580,7 +12322,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -12590,7 +12331,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -12600,7 +12340,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.6.0" } @@ -12609,15 +12348,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "license": "Apache-2.0", - "peer": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -12630,7 +12367,6 @@ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" @@ -12644,7 +12380,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -12658,15 +12393,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -12682,7 +12415,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -12700,7 +12432,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -12713,7 +12444,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -12723,7 +12453,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -12734,7 +12463,6 @@ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -12744,15 +12472,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -12762,7 +12488,6 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -12776,43 +12501,37 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -12822,7 +12541,6 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", - "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -12832,7 +12550,6 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -12842,7 +12559,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -12852,7 +12568,6 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -12865,7 +12580,6 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -12881,7 +12595,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -12890,15 +12603,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -12908,7 +12619,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -12918,7 +12628,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -12928,7 +12637,6 @@ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bare-events": "^2.7.0" } @@ -12938,7 +12646,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -12987,8 +12694,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/fast-uri": { "version": "3.1.0", @@ -13012,7 +12718,6 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -13021,15 +12726,13 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/finalhandler": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -13047,7 +12750,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -13063,8 +12765,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/follow-redirects": { "version": "1.15.11", @@ -13077,7 +12778,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" }, @@ -13092,7 +12792,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -13109,7 +12808,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", - "peer": true, "engines": { "node": ">=14" }, @@ -13122,7 +12820,6 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -13139,7 +12836,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13149,7 +12845,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13162,7 +12857,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13172,7 +12866,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13181,7 +12874,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "peer": true, "dependencies": { "readable-stream": "^1.0.31" }, @@ -13193,15 +12885,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -13213,15 +12903,13 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13231,7 +12919,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -13241,7 +12928,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -13254,7 +12940,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -13279,7 +12964,6 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", - "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -13293,7 +12977,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -13306,7 +12989,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", @@ -13330,7 +13012,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -13346,7 +13027,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -13358,23 +13038,20 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -13384,7 +13061,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -13397,7 +13073,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", - "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -13413,7 +13088,6 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", - "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -13425,8 +13099,7 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/hpack.js": { "version": "2.1.6", @@ -13434,7 +13107,6 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -13447,8 +13119,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -13456,7 +13127,6 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13473,7 +13143,6 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13483,15 +13152,13 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -13511,15 +13178,13 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -13545,22 +13210,19 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/appium-safari-driver/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -13569,15 +13231,13 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", - "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -13593,7 +13253,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -13603,7 +13262,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -13621,15 +13279,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -13642,7 +13298,6 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -13664,7 +13319,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -13679,15 +13333,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/jsftp": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^3.1.0", "ftp-response-parser": "^1.0.1", @@ -13705,7 +13357,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -13714,15 +13365,13 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)", - "peer": true + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/appium-safari-driver/node_modules/json-schema-traverse": { "version": "1.0.0", @@ -13736,7 +13385,6 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14.14.0" } @@ -13746,7 +13394,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -13755,15 +13402,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -13775,15 +13420,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13799,7 +13442,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13809,7 +13451,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14" }, @@ -13821,15 +13462,13 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -13845,7 +13484,6 @@ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "license": "ISC", - "peer": true, "dependencies": { "signal-exit": "^3.0.2" } @@ -13867,7 +13505,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -13884,7 +13521,6 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -13911,7 +13547,6 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -13921,7 +13556,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13931,7 +13565,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -13944,7 +13577,6 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -13960,7 +13592,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -13969,15 +13600,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13987,7 +13616,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13997,7 +13625,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -14014,7 +13641,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -14024,8 +13650,7 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/minipass": { "version": "7.1.2", @@ -14041,7 +13666,6 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -14051,7 +13675,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -14068,7 +13691,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14077,15 +13699,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14097,15 +13717,13 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "license": "MIT", - "peer": true, "bin": { "ncp": "bin/ncp" } @@ -14115,7 +13733,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14147,7 +13764,6 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14160,7 +13776,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver" } @@ -14170,7 +13785,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -14180,7 +13794,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -14193,15 +13806,13 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14214,7 +13825,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14224,7 +13834,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", - "peer": true, "dependencies": { "wrappy": "1" } @@ -14234,7 +13843,6 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", - "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -14244,7 +13852,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14260,7 +13867,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -14284,7 +13890,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14294,7 +13899,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -14307,7 +13911,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -14323,7 +13926,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -14339,7 +13941,6 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", - "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -14358,7 +13959,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14376,7 +13976,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "peer": true, "engines": { "node": ">=0.6.21" } @@ -14386,7 +13985,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14396,7 +13994,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14406,7 +14003,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14415,8 +14011,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/path-scurry": { "version": "2.0.1", @@ -14439,7 +14034,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -14449,22 +14043,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "license": "MIT", - "peer": true, "dependencies": { "find-up": "^5.0.0" }, @@ -14477,7 +14068,6 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -14492,7 +14082,6 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -14525,7 +14114,6 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6.0" } @@ -14534,15 +14122,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -14555,15 +14141,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -14579,7 +14163,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14589,7 +14172,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -14605,7 +14187,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -14622,7 +14203,6 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "license": "MIT", - "peer": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -14638,7 +14218,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -14648,7 +14227,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "license": "MIT", - "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -14679,7 +14257,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -14690,7 +14267,6 @@ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -14700,7 +14276,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -14710,7 +14285,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -14733,7 +14307,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", - "peer": true, "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", @@ -14754,7 +14327,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14764,7 +14336,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -14829,7 +14400,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -14845,15 +14415,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -14862,15 +14430,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "license": "WTFPL OR ISC", - "peer": true, "dependencies": { "truncate-utf8-bytes": "^1.0.0" } @@ -14880,8 +14446,7 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/semver": { "version": "7.7.3", @@ -14900,7 +14465,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -14923,7 +14487,6 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", - "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -14940,7 +14503,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14963,15 +14525,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -14992,8 +14552,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/sharp": { "version": "0.34.5", @@ -15002,7 +14561,6 @@ "hasInstallScript": true, "license": "Apache-2.0", "optional": true, - "peer": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", @@ -15046,7 +14604,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15059,7 +14616,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15081,7 +14637,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -15101,7 +14656,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -15118,7 +14672,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15137,7 +14690,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15156,8 +14708,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/source-map": { "version": "0.6.1", @@ -15183,7 +14734,6 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15193,15 +14743,13 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0", - "peer": true + "license": "CC-BY-3.0" }, "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15211,8 +14759,7 @@ "version": "3.0.22", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0", - "peer": true + "license": "CC0-1.0" }, "node_modules/appium-safari-driver/node_modules/spdy": { "version": "4.0.2", @@ -15220,7 +14767,6 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15238,7 +14784,6 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -15254,7 +14799,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15269,7 +14813,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -15279,7 +14822,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -15289,7 +14831,6 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -15299,7 +14840,6 @@ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", "license": "MIT", - "peer": true, "dependencies": { "duplexer": "~0.1.1", "through": "~2.3.4" @@ -15310,7 +14850,6 @@ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", - "peer": true, "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", @@ -15322,7 +14861,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -15345,15 +14883,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", - "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -15372,7 +14908,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15387,7 +14922,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15396,15 +14930,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15417,7 +14949,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -15434,7 +14965,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15447,7 +14977,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15457,7 +14986,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15473,7 +15001,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -15486,7 +15013,6 @@ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "license": "MIT", - "peer": true, "engines": { "node": ">=20" }, @@ -15499,7 +15025,6 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "license": "MIT", - "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -15527,7 +15052,6 @@ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "b4a": "^1.6.4" } @@ -15536,22 +15060,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -15561,7 +15082,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -15571,7 +15091,6 @@ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "license": "WTFPL", - "peer": true, "dependencies": { "utf8-byte-length": "^1.0.1" } @@ -15581,15 +15100,13 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/type-fest": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", "license": "(MIT OR CC0-1.0)", - "peer": true, "dependencies": { "tagged-tag": "^1.0.0" }, @@ -15605,7 +15122,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", - "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -15620,7 +15136,6 @@ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", "license": "MIT or GPL-2.0", - "peer": true, "engines": { "node": ">= 0.4.0" } @@ -15630,7 +15145,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -15639,15 +15153,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)", - "peer": true + "license": "(WTFPL OR MIT)" }, "node_modules/appium-safari-driver/node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/uuid": { "version": "13.0.0", @@ -15667,7 +15179,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -15678,7 +15189,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -15689,7 +15199,6 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -15699,7 +15208,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -15724,7 +15232,6 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -15747,7 +15254,6 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -15762,7 +15268,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15777,7 +15282,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15792,7 +15296,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15811,7 +15314,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15829,7 +15331,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15838,15 +15339,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15861,7 +15360,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15874,7 +15372,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15883,15 +15380,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15906,7 +15401,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15918,15 +15412,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -15948,7 +15440,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -15958,7 +15449,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -15968,7 +15458,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -15981,7 +15470,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -15999,7 +15487,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -16008,15 +15495,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -16034,7 +15519,6 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "license": "MIT", - "peer": true, "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" @@ -16048,7 +15532,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -16058,7 +15541,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -16071,7 +15553,6 @@ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -18591,6 +18072,7 @@ "resolved": "https://registry.npmjs.org/ink/-/ink-6.5.1.tgz", "integrity": "sha512-wF3j/DmkM8q5E+OtfdQhCRw8/0ahkc8CUTgEddxZzpEWPslu7YPL3t64MWRoI9m6upVGpfAg4ms2BBvxCdKRLQ==", "license": "MIT", + "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.1", "ansi-escapes": "^7.2.0", @@ -18975,6 +18457,7 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } @@ -20327,6 +19810,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } diff --git a/cli/package.json b/cli/package.json index 3848694..744ae89 100644 --- a/cli/package.json +++ b/cli/package.json @@ -36,6 +36,7 @@ "axios": "^1.13.2", "doc-detective-common": "^3.5.1", "doc-detective-core": "^3.5.1", + "doc-detective-resolver": "^3.6.1", "ink": "^6.5.1", "ink-select-input": "^6.2.0", "ink-spinner": "^5.0.0", diff --git a/cli/src/cli/builder/StepEditor.mjs b/cli/src/cli/builder/StepEditor.mjs index e4e406c..aacebc4 100644 --- a/cli/src/cli/builder/StepEditor.mjs +++ b/cli/src/cli/builder/StepEditor.mjs @@ -245,7 +245,8 @@ const StepEditor = ({ // Safety check - if no variants, go back to menu if (typeVariants.length === 0) { - const newStep = { [type]: {} }; + // Preserve sourceLocation when changing step type + const newStep = { [type]: {}, ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; setLocalStep(newStep); setPendingStepType(null); setView('menu'); @@ -258,7 +259,8 @@ const StepEditor = ({ onSelect: (variantIndex, variant) => { // Safety check for variant if (!variant) { - const newStep = { [type]: '' }; + // Preserve sourceLocation when changing step type + const newStep = { [type]: '', ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; setLocalStep(newStep); setPendingStepType(null); setView('menu'); @@ -300,7 +302,8 @@ const StepEditor = ({ newValue = ''; } - const newStep = { [type]: newValue }; + // Preserve sourceLocation when changing step type + const newStep = { [type]: newValue, ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; setLocalStep(newStep); setPendingStepType(null); setView('menu'); @@ -335,12 +338,14 @@ const StepEditor = ({ } else { defaultValue = {}; } - const newStep = { [type]: defaultValue }; + // Preserve sourceLocation when changing step type + const newStep = { [type]: defaultValue, ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; setLocalStep(newStep); setView('menu'); } else { // No variants, default to empty object - const newStep = { [type]: {} }; + // Preserve sourceLocation when changing step type + const newStep = { [type]: {}, ...(localStep.sourceLocation && { sourceLocation: localStep.sourceLocation }) }; setLocalStep(newStep); setView('menu'); } diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index 2685cc3..9681e81 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -21,6 +21,19 @@ import TestEditor from './TestEditor.mjs'; import FieldEditor from './FieldEditor.mjs'; import { StatusBar, JsonPreview, SimpleTextInput, LabeledTextInput, ConfirmPrompt, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; +// Import source file utilities for inline test handling +const { + hasInlineSourceLocations, + getInlineSourceFiles, + hasSourceFileChanged, + getFileContentHash, + serializeStepToInline, + serializeTestToInline, + batchUpdateSourceContent, + prepareSourceUpdates, + hasAutoDetectedSteps, +} = require('./sourceFileUtils.js'); + /** * Determine the output file path based on input file and extension * @param {string|null} inputFilePath - Original input file path @@ -126,6 +139,33 @@ const TestBuilder = ({ const [saveDir, setSaveDir] = useState(outputDir); const [showValidationWarning, setShowValidationWarning] = useState(!isValid && isEditing); + // Inline source tracking state + const [sourceFileHashes, setSourceFileHashes] = useState(() => { + // Compute initial hashes for all inline source files + const hashes = {}; + if (initialSpec) { + const inlineFiles = getInlineSourceFiles(initialSpec); + for (const file of inlineFiles) { + const hash = getFileContentHash(file); + if (hash) { + hashes[file] = hash; + } + } + } + return hashes; + }); + const [changedSourceFiles, setChangedSourceFiles] = useState([]); + const [inlineUpdateError, setInlineUpdateError] = useState(null); + + // Track original spec for detecting which steps were modified + const [originalSpec] = useState(() => initialSpec ? JSON.parse(JSON.stringify(initialSpec)) : null); + + // Check if spec has inline source locations + const hasInlineSources = useMemo(() => hasInlineSourceLocations(spec), [spec]); + + // Check if spec has auto-detected steps + const hasAutoDetected = useMemo(() => hasAutoDetectedSteps(spec), [spec]); + // Get spec fields const { fields: specFields } = useMemo(() => getSpecFields(), []); @@ -443,6 +483,253 @@ const TestBuilder = ({ ); } + // Pre-save check for inline sources + if (phase === 'preSave') { + // Check if any inline source files have changed + const changed = []; + const inlineFiles = getInlineSourceFiles(spec); + for (const file of inlineFiles) { + const originalHash = sourceFileHashes[file]; + if (originalHash && hasSourceFileChanged(file, originalHash)) { + changed.push(file); + } + } + + if (changed.length > 0) { + setChangedSourceFiles(changed); + setPhase('sourceChanged'); + } else if (hasInlineSources) { + setPhase('inlineSaveChoice'); + } else { + setPhase('save'); + } + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(Text, { color: 'cyan' }, 'Checking source files...') + ); + } + + // Source files changed warning + if (phase === 'sourceChanged') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'yellow' }, '⚠️ Source Files Changed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'The following source files have been modified since they were loaded:') + ), + ...changedSourceFiles.map((file, i) => + React.createElement( + Box, + { key: i, marginLeft: 2, marginBottom: 0 }, + React.createElement(Text, { color: 'yellow' }, `• ${path.basename(file)}`) + ) + ), + React.createElement( + Box, + { marginTop: 1, marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'Updating inline sources may cause conflicts. You can save as a separate .spec.json file instead.') + ), + React.createElement(SelectInput, { + items: [ + { label: '📁 Save as .spec.json (recommended)', value: 'saveAsSpec' }, + { label: '⚠️ Update source files anyway', value: 'updateSources' }, + { label: '← Cancel', value: 'cancel' }, + ], + onSelect: (item) => { + if (item.value === 'saveAsSpec') { + setPhase('save'); + } else if (item.value === 'updateSources') { + setPhase('inlineUpdate'); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Choice between updating inline sources or saving as spec + if (phase === 'inlineSaveChoice') { + const inlineFiles = Array.from(getInlineSourceFiles(spec)); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '📝 Inline Sources Detected') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'This spec contains inline tests from:') + ), + ...inlineFiles.map((file, i) => + React.createElement( + Box, + { key: i, marginLeft: 2, marginBottom: 0 }, + React.createElement(Text, { color: 'gray' }, `• ${path.basename(file)}`) + ) + ), + // Show note about auto-detected steps if present + hasAutoDetected && React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'yellow' }, + '⚠️ Some steps were auto-detected from markup. If edited, explicit comments will be added after the original content.' + ) + ), + React.createElement( + Box, + { marginTop: 1, marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'How would you like to save changes?') + ), + React.createElement(SelectInput, { + items: [ + { label: '✏️ Update source files (preserve inline tests)', value: 'updateSources' }, + { label: '📁 Save as .spec.json (separate file)', value: 'saveAsSpec' }, + { label: '← Cancel', value: 'cancel' }, + ], + onSelect: (item) => { + if (item.value === 'updateSources') { + setPhase('inlineUpdate'); + } else if (item.value === 'saveAsSpec') { + setPhase('save'); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Update inline sources + if (phase === 'inlineUpdate') { + // Use prepareSourceUpdates to handle both explicit inline steps and auto-detected steps + // Auto-detected steps will have new explicit comments inserted after the original content + const updatesByFile = prepareSourceUpdates({ spec, originalSpec }); + + // Apply updates to each file + const errors = []; + for (const [file, updates] of updatesByFile) { + const result = batchUpdateSourceContent({ filePath: file, updates }); + if (!result.success) { + errors.push(`${path.basename(file)}: ${result.error || 'Unknown error'}`); + } + } + + if (errors.length > 0) { + setInlineUpdateError(errors.join('\n')); + setPhase('inlineUpdateError'); + } else { + // Update hashes for modified files + const newHashes = { ...sourceFileHashes }; + for (const file of updatesByFile.keys()) { + const hash = getFileContentHash(file); + if (hash) { + newHashes[file] = hash; + } + } + setSourceFileHashes(newHashes); + setPhase('inlineUpdateSuccess'); + } + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(Text, { color: 'cyan' }, 'Updating source files...') + ); + } + + // Inline update error + if (phase === 'inlineUpdateError') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'red' }, '❌ Error Updating Source Files') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red' }, inlineUpdateError) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'You can still save as a separate .spec.json file.') + ), + React.createElement(SelectInput, { + items: [ + { label: '📁 Save as .spec.json instead', value: 'saveAsSpec' }, + { label: '← Back to menu', value: 'menu' }, + ], + onSelect: (item) => { + setInlineUpdateError(null); + if (item.value === 'saveAsSpec') { + setPhase('save'); + } else { + setPhase('menu'); + } + }, + }) + ); + } + + // Inline update success + if (phase === 'inlineUpdateSuccess') { + const updatedFiles = Array.from(getInlineSourceFiles(spec)); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'green', bold: true }, '✅ Source files updated successfully!') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'Updated files:') + ), + ...updatedFiles.map((file, i) => + React.createElement( + Box, + { key: i, marginLeft: 2, marginBottom: 0 }, + React.createElement(Text, { color: 'green' }, `✓ ${path.basename(file)}`) + ) + ), + React.createElement(SelectInput, { + items: [ + { label: 'Continue editing', value: 'continue' }, + { label: 'Exit', value: 'exit' }, + ], + onSelect: (item) => { + if (item.value === 'exit') { + exit(); + } else { + setPhase('menu'); + } + }, + }) + ); + } + // Save confirmation if (phase === 'save') { const isOverwrite = inputFilePath && (inputFileExtension === '.json' || inputFileExtension === '.yaml' || inputFileExtension === '.yml'); @@ -667,7 +954,8 @@ const TestBuilder = ({ setPhase('preview'); break; case 'save': - setPhase('save'); + // Use preSave to check for inline sources before saving + setPhase('preSave'); break; case 'back': if (onBack) onBack(); diff --git a/cli/src/cli/builder/sourceFileUtils.js b/cli/src/cli/builder/sourceFileUtils.js new file mode 100644 index 0000000..905f1f3 --- /dev/null +++ b/cli/src/cli/builder/sourceFileUtils.js @@ -0,0 +1,521 @@ +/** + * Source file update utilities for inline test editing + * + * This module provides functions to: + * - Serialize steps to inline comment format + * - Update/insert content at specific positions in source files + * - Handle different comment formats (HTML, JSX, link reference) + */ + +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); + +/** + * Serialize a step to inline comment format based on the detected or default comment format. + * + * @param {Object} options - Options for serialization + * @param {Object} options.step - The step object to serialize + * @param {string} options.commentFormat - Comment format: 'htmlComment', 'jsxComment', or 'linkReference' + * @param {string} options.fileExtension - File extension (e.g., '.md', '.jsx') for fallback format detection + * @returns {string} The serialized inline step comment + */ +function serializeStepToInline({ step, commentFormat, fileExtension }) { + // Determine the comment format to use + const format = commentFormat || getDefaultCommentFormat(fileExtension); + + // Clone step and remove sourceLocation (it's read-only metadata, not serializable content) + const stepToSerialize = { ...step }; + delete stepToSerialize.sourceLocation; + + // Determine the step type (action key) + const actionKey = Object.keys(stepToSerialize).find(key => + !['stepId', 'description', 'unsafe', 'outputs', 'variables', 'breakpoint', '$schema'].includes(key) + ); + + if (!actionKey) { + throw new Error('Cannot serialize step: no action found'); + } + + // Check if we can use simple format (just the action value) + const canUseSimpleFormat = canSerializeAsSimple(stepToSerialize, actionKey); + + let stepContent; + if (canUseSimpleFormat) { + // Simple format: just the action and its value + const actionValue = stepToSerialize[actionKey]; + if (typeof actionValue === 'string') { + stepContent = `${actionKey}: "${actionValue}"`; + } else if (typeof actionValue === 'boolean' || typeof actionValue === 'number') { + stepContent = `${actionKey}: ${actionValue}`; + } else { + stepContent = `${actionKey}: ${JSON.stringify(actionValue)}`; + } + } else { + // Full format: JSON object + stepContent = JSON.stringify(stepToSerialize); + } + + // Wrap in appropriate comment format + switch (format) { + case 'jsxComment': + return `{/* step ${stepContent} */}`; + case 'linkReference': + // Link reference format doesn't support arbitrary step content + // Fall back to HTML comment + return ``; + case 'htmlComment': + default: + return ``; + } +} + +/** + * Serialize a test declaration to inline comment format. + * + * @param {Object} options - Options for serialization + * @param {Object} options.test - The test object to serialize (only metadata, not steps) + * @param {string} options.commentFormat - Comment format to use + * @param {string} options.fileExtension - File extension for fallback format detection + * @returns {string} The serialized inline test comment + */ +function serializeTestToInline({ test, commentFormat, fileExtension }) { + const format = commentFormat || getDefaultCommentFormat(fileExtension); + + // Clone test and remove non-serializable properties + const testToSerialize = {}; + if (test.testId) testToSerialize.testId = test.testId; + if (test.description) testToSerialize.description = test.description; + if (test.detectSteps !== undefined) testToSerialize.detectSteps = test.detectSteps; + if (test.runOn) testToSerialize.runOn = test.runOn; + if (test.before) testToSerialize.before = test.before; + if (test.after) testToSerialize.after = test.after; + + // Check if we need the full object or can use simple attributes + const needsFullObject = test.runOn || test.before || test.after; + + let testContent; + if (needsFullObject) { + testContent = JSON.stringify(testToSerialize); + } else { + // Use XML-style attributes for simple cases + const attrs = []; + if (testToSerialize.testId) attrs.push(`testId="${testToSerialize.testId}"`); + if (testToSerialize.description) attrs.push(`description="${testToSerialize.description}"`); + if (testToSerialize.detectSteps !== undefined) attrs.push(`detectSteps=${testToSerialize.detectSteps}`); + testContent = attrs.join(' '); + } + + switch (format) { + case 'jsxComment': + return `{/* test ${testContent} */}`; + case 'htmlComment': + default: + return ``; + } +} + +/** + * Determine the default comment format based on file extension. + * + * @param {string} fileExtension - File extension (e.g., '.md', '.jsx') + * @returns {string} Default comment format for the file type + */ +function getDefaultCommentFormat(fileExtension) { + const ext = (fileExtension || '').toLowerCase(); + + // JSX/TSX/MDX files use JSX comments + if (['.jsx', '.tsx', '.mdx'].includes(ext)) { + return 'jsxComment'; + } + + // All other files (including .md, .html) use HTML comments + return 'htmlComment'; +} + +/** + * Check if a step can be serialized in simple format (just action: value). + * + * @param {Object} step - The step object + * @param {string} actionKey - The action key + * @returns {boolean} True if simple format can be used + */ +function canSerializeAsSimple(step, actionKey) { + // Count properties that aren't the action or common step properties + const nonActionKeys = Object.keys(step).filter(key => + key !== actionKey && + !['stepId', 'description', 'unsafe', 'outputs', 'variables', 'breakpoint', '$schema'].includes(key) + ); + + // If there are other non-common properties, can't use simple format + if (nonActionKeys.length > 0) { + return false; + } + + // Check if step has any common properties set (other than default values) + const hasCommonProps = + step.stepId || + step.description || + step.unsafe === true || + (step.outputs && Object.keys(step.outputs).length > 0) || + (step.variables && Object.keys(step.variables).length > 0) || + step.breakpoint === true; + + if (hasCommonProps) { + return false; + } + + // Check if the action value is simple (string, number, boolean) + const actionValue = step[actionKey]; + return typeof actionValue === 'string' || + typeof actionValue === 'number' || + typeof actionValue === 'boolean'; +} + +/** + * Calculate the hash of a file's content for change detection. + * + * @param {string} filePath - Path to the file + * @returns {string|null} MD5 hash of the file content, or null if file doesn't exist + */ +function getFileContentHash(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf8'); + return crypto.createHash('md5').update(content).digest('hex'); + } catch (error) { + return null; + } +} + +/** + * Check if a source file has changed since it was detected. + * + * @param {string} filePath - Path to the source file + * @param {string} originalContent - Original content (or hash) from detection time + * @returns {boolean} True if the file has changed + */ +function hasSourceFileChanged(filePath, originalContent) { + try { + const currentContent = fs.readFileSync(filePath, 'utf8'); + + // If originalContent is a hash, compare hashes + if (originalContent.length === 32 && /^[a-f0-9]+$/i.test(originalContent)) { + const currentHash = crypto.createHash('md5').update(currentContent).digest('hex'); + return currentHash !== originalContent; + } + + // Otherwise compare content directly + return currentContent !== originalContent; + } catch (error) { + // If file doesn't exist or can't be read, it has changed + return true; + } +} + +/** + * Update content at a specific position in a file. + * + * @param {Object} options - Options for the update + * @param {string} options.filePath - Path to the file to update + * @param {number} options.startOffset - Start offset for replacement + * @param {number} options.endOffset - End offset for replacement + * @param {string} options.newContent - New content to insert + * @returns {Object} Result with success status and any error message + */ +function updateSourceContent({ filePath, startOffset, endOffset, newContent }) { + try { + const content = fs.readFileSync(filePath, 'utf8'); + + // Validate offsets + if (startOffset < 0 || endOffset > content.length || startOffset > endOffset) { + return { + success: false, + error: `Invalid offsets: start=${startOffset}, end=${endOffset}, fileLength=${content.length}`, + }; + } + + // Perform replacement + const before = content.substring(0, startOffset); + const after = content.substring(endOffset); + const updatedContent = before + newContent + after; + + // Write back to file + fs.writeFileSync(filePath, updatedContent, 'utf8'); + + return { + success: true, + offsetDelta: newContent.length - (endOffset - startOffset), + }; + } catch (error) { + return { + success: false, + error: error.message, + }; + } +} + +/** + * Insert content at a specific position in a file. + * + * @param {Object} options - Options for the insertion + * @param {string} options.filePath - Path to the file + * @param {number} options.offset - Offset where to insert + * @param {string} options.content - Content to insert + * @param {boolean} options.insertBefore - If true, insert before the offset position + * @returns {Object} Result with success status + */ +function insertSourceContent({ filePath, offset, content, insertBefore = false }) { + return updateSourceContent({ + filePath, + startOffset: insertBefore ? offset : offset, + endOffset: insertBefore ? offset : offset, + newContent: content, + }); +} + +/** + * Apply multiple source location updates to a file. + * Updates are applied in reverse order (from end to start) to maintain offset validity. + * + * @param {Object} options - Options for batch updates + * @param {string} options.filePath - Path to the file + * @param {Array} options.updates - Array of update objects with startOffset, endOffset, newContent + * @returns {Object} Result with success status and array of individual results + */ +function batchUpdateSourceContent({ filePath, updates }) { + if (!updates || updates.length === 0) { + return { success: true, results: [] }; + } + + try { + let content = fs.readFileSync(filePath, 'utf8'); + + // Sort updates by startOffset in descending order to maintain offset validity + const sortedUpdates = [...updates].sort((a, b) => b.startOffset - a.startOffset); + + const results = []; + + for (const update of sortedUpdates) { + const { startOffset, endOffset, newContent } = update; + + // Validate offsets + if (startOffset < 0 || endOffset > content.length || startOffset > endOffset) { + results.push({ + success: false, + error: `Invalid offsets: start=${startOffset}, end=${endOffset}`, + update, + }); + continue; + } + + // Perform replacement + const before = content.substring(0, startOffset); + const after = content.substring(endOffset); + content = before + newContent + after; + + results.push({ + success: true, + offsetDelta: newContent.length - (endOffset - startOffset), + update, + }); + } + + // Write the final content + fs.writeFileSync(filePath, content, 'utf8'); + + return { + success: results.every(r => r.success), + results, + }; + } catch (error) { + return { + success: false, + error: error.message, + results: [], + }; + } +} + +/** + * Check if a spec or any of its tests/steps have inline source locations. + * + * @param {Object} spec - The spec object to check + * @returns {boolean} True if any inline source locations exist + */ +function hasInlineSourceLocations(spec) { + if (!spec) return false; + + for (const test of (spec.tests || [])) { + // Check test sourceLocation + if (test.sourceLocation?.isInline) { + return true; + } + + // Check step sourceLocations + for (const step of (test.steps || [])) { + if (step.sourceLocation?.isInline) { + return true; + } + } + } + + return false; +} + +/** + * Get all inline source files referenced by a spec. + * + * @param {Object} spec - The spec object + * @returns {Set} Set of unique file paths + */ +function getInlineSourceFiles(spec) { + const files = new Set(); + + if (!spec) return files; + + for (const test of (spec.tests || [])) { + if (test.sourceLocation?.isInline && test.sourceLocation.file) { + files.add(test.sourceLocation.file); + } + + for (const step of (test.steps || [])) { + if (step.sourceLocation?.isInline && step.sourceLocation.file) { + files.add(step.sourceLocation.file); + } + } + } + + return files; +} + +/** + * Check if a step is auto-detected (from markup patterns like code blocks or links). + * Auto-detected steps need special handling when edited - they should be converted + * to explicit inline comments rather than replacing the original markup. + * + * @param {Object} step - The step object to check + * @returns {boolean} True if the step was auto-detected + */ +function isAutoDetectedStep(step) { + return step?.sourceLocation?.isAutoDetected === true; +} + +/** + * Prepare updates for saving inline steps to source files. + * Handles both explicit inline steps (update in place) and auto-detected steps + * (insert new explicit comment after the original content). + * + * @param {Object} options - Options for preparing updates + * @param {Object} options.spec - The spec object containing tests and steps + * @param {Object} options.originalSpec - The original spec before editing (for comparison) + * @returns {Map} Map of file paths to arrays of update operations + */ +function prepareSourceUpdates({ spec, originalSpec }) { + const updatesByFile = new Map(); + + if (!spec?.tests) return updatesByFile; + + for (let testIndex = 0; testIndex < spec.tests.length; testIndex++) { + const test = spec.tests[testIndex]; + const originalTest = originalSpec?.tests?.[testIndex]; + + for (let stepIndex = 0; stepIndex < (test.steps || []).length; stepIndex++) { + const step = test.steps[stepIndex]; + const originalStep = originalTest?.steps?.[stepIndex]; + const loc = step.sourceLocation; + + // Skip if no inline source location + if (!loc?.isInline || !loc.file) continue; + + // Check if step was modified by comparing with original + const stepContent = JSON.stringify(step, (key, value) => + key === 'sourceLocation' ? undefined : value + ); + const originalContent = originalStep ? JSON.stringify(originalStep, (key, value) => + key === 'sourceLocation' ? undefined : value + ) : null; + + const wasModified = stepContent !== originalContent; + + // Skip if not modified + if (!wasModified) continue; + + const fileUpdates = updatesByFile.get(loc.file) || []; + + if (loc.isAutoDetected) { + // Auto-detected step: insert new explicit comment AFTER the original content + // The original markup (code block, link, etc.) remains intact + const newContent = serializeStepToInline({ + step, + commentFormat: loc.commentFormat || 'htmlComment', + fileExtension: path.extname(loc.file), + }); + + // Insert after the original content (at endOffset) + // Add a newline before the comment for readability + fileUpdates.push({ + startOffset: loc.endOffset, + endOffset: loc.endOffset, + newContent: '\n' + newContent, + isInsertion: true, + isAutoDetectedConversion: true, + }); + } else { + // Explicit inline step: update in place + const newContent = serializeStepToInline({ + step, + commentFormat: loc.commentFormat, + fileExtension: path.extname(loc.file), + }); + + fileUpdates.push({ + startOffset: loc.startOffset, + endOffset: loc.endOffset, + newContent, + isInsertion: false, + }); + } + + updatesByFile.set(loc.file, fileUpdates); + } + } + + return updatesByFile; +} + +/** + * Check if a spec has any auto-detected steps. + * + * @param {Object} spec - The spec object to check + * @returns {boolean} True if any steps are auto-detected + */ +function hasAutoDetectedSteps(spec) { + if (!spec?.tests) return false; + + for (const test of spec.tests) { + for (const step of (test.steps || [])) { + if (isAutoDetectedStep(step)) { + return true; + } + } + } + + return false; +} + +module.exports = { + serializeStepToInline, + serializeTestToInline, + getDefaultCommentFormat, + canSerializeAsSimple, + getFileContentHash, + hasSourceFileChanged, + updateSourceContent, + insertSourceContent, + batchUpdateSourceContent, + hasInlineSourceLocations, + getInlineSourceFiles, + isAutoDetectedStep, + prepareSourceUpdates, + hasAutoDetectedSteps, +}; diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index 37355c3..f984e84 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -807,6 +807,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -859,6 +965,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -919,6 +1131,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1135,6 +1453,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1458,6 +1882,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2878,6 +3408,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3368,6 +4004,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4433,14 +5175,120 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false }, "outputs": { "type": "object", @@ -4740,6 +5588,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5033,6 +5987,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5348,6 +6408,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6000,6 +7166,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6316,6 +7588,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6488,6 +7866,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6573,6 +8057,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6653,6 +8243,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7220,6 +8916,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7519,6 +9321,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8715,6 +10623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8767,6 +10781,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8827,6 +10947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9018,30 +11244,136 @@ ] } ] - } - }, - "title": "checkLink" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." + } + }, + "title": "checkLink" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] }, "description": { "type": "string", @@ -9366,6 +11698,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10786,6 +13224,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11276,6 +13820,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12341,6 +14991,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12648,6 +15404,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12941,6 +15803,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13252,10 +16220,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13908,6 +16982,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14224,6 +17404,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14396,6 +17682,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14481,6 +17873,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14561,6 +18059,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15128,6 +18732,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15427,6 +19137,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/report_v3.schema.json b/common/dist/schemas/report_v3.schema.json index 6cc1350..6955451 100644 --- a/common/dist/schemas/report_v3.schema.json +++ b/common/dist/schemas/report_v3.schema.json @@ -627,6 +627,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -1240,6 +1346,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1292,6 +1504,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1352,6 +1670,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1568,6 +1992,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1891,6 +2421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3311,6 +3947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3801,20 +4543,126 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." @@ -4866,6 +5714,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5173,6 +6127,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5466,6 +6526,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5781,6 +6947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6433,6 +7705,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6749,33 +8127,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -6921,6 +8405,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7006,6 +8596,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7086,6 +8782,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7653,6 +9455,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7952,6 +9860,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8717,24 +10731,130 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } }, "title": "Outputs (step)" }, @@ -8769,6 +10889,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8829,6 +11055,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9045,6 +11377,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9368,6 +11806,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10788,6 +13332,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11278,23 +13928,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12343,6 +15099,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12650,6 +15512,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12943,6 +15911,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13258,6 +16332,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13910,6 +17090,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14226,6 +17512,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14398,6 +17790,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14483,6 +17981,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14563,6 +18167,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15130,6 +18840,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15429,6 +19245,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index a0f89f7..5140171 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -820,6 +820,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -872,6 +978,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -932,6 +1144,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1148,6 +1466,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1471,6 +1895,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2891,6 +3421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3381,33 +4017,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -4446,6 +5188,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4753,6 +5601,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5046,6 +6000,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5361,6 +6421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6013,6 +7179,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6329,12 +7601,118 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", "default": false }, @@ -6501,6 +7879,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6586,6 +8070,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6666,6 +8256,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7233,6 +8929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7532,6 +9334,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8728,27 +10636,133 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, "variables": { "type": "object", "description": "Environment variables to set from user-defined expressions.", @@ -8780,6 +10794,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8840,6 +10960,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9056,6 +11282,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9379,6 +11711,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10799,6 +13237,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11289,23 +13833,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12354,6 +15004,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12661,6 +15417,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12954,6 +15816,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13269,6 +16237,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13921,6 +16995,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14237,27 +17417,133 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, "variables": { "type": "object", "description": "Environment variables to set from user-defined expressions.", @@ -14409,6 +17695,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14494,6 +17886,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14574,6 +18072,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15141,6 +18745,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15440,6 +19150,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -16792,25 +20608,131 @@ "type": "string", "description": "Unique identifier for the test." }, - "description": { - "type": "string", - "description": "Description of the test." - }, - "contentPath": { - "type": "string", - "description": "Path to the content that the test is associated with." - }, - "detectSteps": { - "type": "boolean", - "description": "Whether or not to detect steps in input files based on markup regex.", - "default": true - }, - "runOn": { - "type": "array", - "description": "Contexts to run the test in. Overrides contexts defined at the config and spec levels.", - "items": { - "anyOf": [ - { + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the test." + }, + "contentPath": { + "type": "string", + "description": "Path to the content that the test is associated with." + }, + "detectSteps": { + "type": "boolean", + "description": "Whether or not to detect steps in input files based on markup regex.", + "default": true + }, + "runOn": { + "type": "array", + "description": "Contexts to run the test in. Overrides contexts defined at the config and spec levels.", + "items": { + "anyOf": [ + { "$schema": "http://json-schema.org/draft-07/schema#", "title": "context", "type": "object", @@ -17405,6 +21327,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17457,6 +21485,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17517,6 +21651,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17733,6 +21973,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -18056,6 +22402,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -19476,21 +23928,127 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -19966,6 +24524,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21031,6 +25695,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21338,6 +26108,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21631,6 +26507,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21946,6 +26928,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -22598,33 +27686,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -22914,6 +28108,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23086,6 +28386,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23171,6 +28577,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23251,6 +28763,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23818,6 +29436,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24117,6 +29841,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24882,6 +30712,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24934,6 +30870,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24994,6 +31036,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25210,6 +31358,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25533,6 +31787,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -26949,10 +33309,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27443,6 +33909,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28508,6 +35080,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28815,6 +35493,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29108,6 +35892,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29423,6 +36313,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30050,30 +37046,136 @@ } } ] - } - }, - "title": "screenshot" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." + } + }, + "title": "screenshot" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] }, "description": { "type": "string", @@ -30391,6 +37493,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30563,6 +37771,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30648,6 +37962,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30728,6 +38148,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31295,6 +38821,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31594,6 +39226,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/sourceLocation_v3.schema.json b/common/dist/schemas/sourceLocation_v3.schema.json new file mode 100644 index 0000000..a94b9b3 --- /dev/null +++ b/common/dist/schemas/sourceLocation_v3.schema.json @@ -0,0 +1,106 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "description": "Tracks the original source location of a test or step for inline editing support. This is a read-only property populated during test detection.", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] +} \ No newline at end of file diff --git a/common/dist/schemas/spec_v3.schema.json b/common/dist/schemas/spec_v3.schema.json index 6c1d56a..d36c97c 100644 --- a/common/dist/schemas/spec_v3.schema.json +++ b/common/dist/schemas/spec_v3.schema.json @@ -609,6 +609,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -1222,6 +1328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1274,6 +1486,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1334,6 +1652,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1550,6 +1974,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1873,6 +2403,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3293,6 +3929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3783,20 +4525,126 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." @@ -4848,6 +5696,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5155,6 +6109,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5448,6 +6508,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5763,6 +6929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6415,6 +7687,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6731,33 +8109,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -6903,6 +8387,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6988,6 +8578,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7068,6 +8764,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7635,6 +9437,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7934,6 +9842,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8699,24 +10713,130 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } }, "title": "Outputs (step)" }, @@ -8751,6 +10871,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8811,6 +11037,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9027,6 +11359,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9350,6 +11788,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10770,6 +13314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11260,23 +13910,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12325,6 +15081,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12632,6 +15494,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12925,6 +15893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13240,6 +16314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13892,6 +17072,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14208,6 +17494,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14380,6 +17772,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14465,6 +17963,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14545,6 +18149,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15112,6 +18822,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15411,6 +19227,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/step_v3.schema.json b/common/dist/schemas/step_v3.schema.json index 8960667..3de27b4 100644 --- a/common/dist/schemas/step_v3.schema.json +++ b/common/dist/schemas/step_v3.schema.json @@ -22,6 +22,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -74,6 +180,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -134,6 +346,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -350,6 +668,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -673,6 +1097,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2093,6 +2623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2583,6 +3219,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3648,6 +4390,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3955,13 +4803,119 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", "default": false }, "outputs": { @@ -4248,6 +5202,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4563,6 +5623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5215,6 +6381,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5531,6 +6803,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5703,6 +7081,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5788,6 +7272,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5868,6 +7458,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6435,6 +8131,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6734,6 +8536,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/dist/schemas/test_v3.schema.json b/common/dist/schemas/test_v3.schema.json index 9d86ed1..19f99ec 100644 --- a/common/dist/schemas/test_v3.schema.json +++ b/common/dist/schemas/test_v3.schema.json @@ -8,6 +8,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -621,6 +727,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -673,6 +885,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -733,6 +1051,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -949,6 +1373,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1272,6 +1802,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2692,6 +3328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3182,25 +3924,131 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, "title": "Outputs (step)" }, "variables": { @@ -4247,6 +5095,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4554,6 +5508,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4847,6 +5907,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5162,6 +6328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5814,6 +7086,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6130,31 +7508,137 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", @@ -6302,6 +7786,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6387,6 +7977,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6467,6 +8163,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7034,6 +8836,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7333,6 +9241,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8098,26 +10112,132 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" }, "variables": { "type": "object", @@ -8150,6 +10270,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8210,6 +10436,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8426,6 +10758,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8749,6 +11187,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10169,6 +12713,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10659,22 +13309,128 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", "description": "Runtime expression for a user-defined output value." } }, @@ -11724,6 +14480,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12031,6 +14893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12324,6 +15292,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12639,6 +15713,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13291,6 +16471,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13607,6 +16893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13779,6 +17171,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13864,6 +17362,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13944,6 +17548,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14511,6 +18221,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14810,6 +18626,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/package-lock.json b/common/package-lock.json index 633aa5a..a3f9052 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -202,6 +202,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/common/src/schemas/dereferenceSchemas.js b/common/src/schemas/dereferenceSchemas.js index cd1d7c5..dcfa6c4 100644 --- a/common/src/schemas/dereferenceSchemas.js +++ b/common/src/schemas/dereferenceSchemas.js @@ -44,6 +44,7 @@ async function dereferenceSchemas() { "runShell_v3.schema.json", "saveCookie_v3.schema.json", "screenshot_v3.schema.json", + "sourceLocation_v3.schema.json", "spec_v3.schema.json", "step_v3.schema.json", "stopRecord_v3.schema.json", diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index 37355c3..f984e84 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -807,6 +807,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -859,6 +965,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -919,6 +1131,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1135,6 +1453,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1458,6 +1882,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2878,6 +3408,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3368,6 +4004,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4433,14 +5175,120 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false }, "outputs": { "type": "object", @@ -4740,6 +5588,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5033,6 +5987,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5348,6 +6408,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6000,6 +7166,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6316,6 +7588,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6488,6 +7866,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6573,6 +8057,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6653,6 +8243,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7220,6 +8916,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7519,6 +9321,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8715,6 +10623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8767,6 +10781,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8827,6 +10947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9018,30 +11244,136 @@ ] } ] - } - }, - "title": "checkLink" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." + } + }, + "title": "checkLink" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] }, "description": { "type": "string", @@ -9366,6 +11698,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10786,6 +13224,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11276,6 +13820,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12341,6 +14991,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12648,6 +15404,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12941,6 +15803,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13252,10 +16220,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13908,6 +16982,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14224,6 +17404,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14396,6 +17682,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14481,6 +17873,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14561,6 +18059,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15128,6 +18732,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15427,6 +19137,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/report_v3.schema.json b/common/src/schemas/output_schemas/report_v3.schema.json index 6cc1350..6955451 100644 --- a/common/src/schemas/output_schemas/report_v3.schema.json +++ b/common/src/schemas/output_schemas/report_v3.schema.json @@ -627,6 +627,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -1240,6 +1346,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1292,6 +1504,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1352,6 +1670,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1568,6 +1992,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1891,6 +2421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3311,6 +3947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3801,20 +4543,126 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." @@ -4866,6 +5714,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5173,6 +6127,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5466,6 +6526,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5781,6 +6947,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6433,6 +7705,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6749,33 +8127,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -6921,6 +8405,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7006,6 +8596,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7086,6 +8782,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7653,6 +9455,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7952,6 +9860,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8717,24 +10731,130 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } }, "title": "Outputs (step)" }, @@ -8769,6 +10889,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8829,6 +11055,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9045,6 +11377,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9368,6 +11806,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10788,6 +13332,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11278,23 +13928,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12343,6 +15099,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12650,6 +15512,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12943,6 +15911,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13258,6 +16332,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13910,6 +17090,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14226,6 +17512,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14398,6 +17790,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14483,6 +17981,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14563,6 +18167,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15130,6 +18840,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15429,6 +19245,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index a0f89f7..5140171 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -820,6 +820,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -872,6 +978,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -932,6 +1144,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1148,6 +1466,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1471,6 +1895,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2891,6 +3421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3381,33 +4017,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -4446,6 +5188,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4753,6 +5601,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5046,6 +6000,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5361,6 +6421,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6013,6 +7179,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6329,12 +7601,118 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", "default": false }, @@ -6501,6 +7879,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6586,6 +8070,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6666,6 +8256,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7233,6 +8929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7532,6 +9334,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8728,27 +10636,133 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, "variables": { "type": "object", "description": "Environment variables to set from user-defined expressions.", @@ -8780,6 +10794,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8840,6 +10960,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9056,6 +11282,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9379,6 +11711,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10799,6 +13237,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11289,23 +13833,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12354,6 +15004,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12661,6 +15417,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12954,6 +15816,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13269,6 +16237,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13921,6 +16995,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14237,27 +17417,133 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, "variables": { "type": "object", "description": "Environment variables to set from user-defined expressions.", @@ -14409,6 +17695,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14494,6 +17886,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14574,6 +18072,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15141,6 +18745,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15440,6 +19150,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -16792,25 +20608,131 @@ "type": "string", "description": "Unique identifier for the test." }, - "description": { - "type": "string", - "description": "Description of the test." - }, - "contentPath": { - "type": "string", - "description": "Path to the content that the test is associated with." - }, - "detectSteps": { - "type": "boolean", - "description": "Whether or not to detect steps in input files based on markup regex.", - "default": true - }, - "runOn": { - "type": "array", - "description": "Contexts to run the test in. Overrides contexts defined at the config and spec levels.", - "items": { - "anyOf": [ - { + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the test." + }, + "contentPath": { + "type": "string", + "description": "Path to the content that the test is associated with." + }, + "detectSteps": { + "type": "boolean", + "description": "Whether or not to detect steps in input files based on markup regex.", + "default": true + }, + "runOn": { + "type": "array", + "description": "Contexts to run the test in. Overrides contexts defined at the config and spec levels.", + "items": { + "anyOf": [ + { "$schema": "http://json-schema.org/draft-07/schema#", "title": "context", "type": "object", @@ -17405,6 +21327,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17457,6 +21485,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17517,6 +21651,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -17733,6 +21973,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -18056,6 +22402,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -19476,21 +23928,127 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -19966,6 +24524,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21031,6 +25695,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21338,6 +26108,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21631,6 +26507,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21946,6 +26928,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -22598,33 +27686,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { - "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -22914,6 +28108,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23086,6 +28386,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23171,6 +28577,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23251,6 +28763,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23818,6 +29436,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24117,6 +29841,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24882,6 +30712,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24934,6 +30870,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24994,6 +31036,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25210,6 +31358,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25533,6 +31787,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -26949,10 +33309,116 @@ "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27443,6 +33909,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28508,6 +35080,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28815,6 +35493,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29108,6 +35892,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29423,6 +36313,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30050,30 +37046,136 @@ } } ] - } - }, - "title": "screenshot" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." + } + }, + "title": "screenshot" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] }, "description": { "type": "string", @@ -30391,6 +37493,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30563,6 +37771,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30648,6 +37962,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30728,6 +38148,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31295,6 +38821,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31594,6 +39226,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/sourceLocation_v3.schema.json b/common/src/schemas/output_schemas/sourceLocation_v3.schema.json new file mode 100644 index 0000000..a94b9b3 --- /dev/null +++ b/common/src/schemas/output_schemas/sourceLocation_v3.schema.json @@ -0,0 +1,106 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "description": "Tracks the original source location of a test or step for inline editing support. This is a read-only property populated during test detection.", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] +} \ No newline at end of file diff --git a/common/src/schemas/output_schemas/spec_v3.schema.json b/common/src/schemas/output_schemas/spec_v3.schema.json index 6c1d56a..d36c97c 100644 --- a/common/src/schemas/output_schemas/spec_v3.schema.json +++ b/common/src/schemas/output_schemas/spec_v3.schema.json @@ -609,6 +609,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -1222,6 +1328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1274,6 +1486,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1334,6 +1652,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1550,6 +1974,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1873,6 +2403,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3293,6 +3929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3783,20 +4525,126 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." @@ -4848,6 +5696,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5155,6 +6109,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5448,6 +6508,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5763,6 +6929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6415,6 +7687,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6731,33 +8109,139 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { "type": "string", "description": "Runtime expression for a user-defined output value." } @@ -6903,6 +8387,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6988,6 +8578,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7068,6 +8764,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7635,6 +9437,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7934,6 +9842,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8699,24 +10713,130 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } }, "title": "Outputs (step)" }, @@ -8751,6 +10871,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8811,6 +11037,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9027,6 +11359,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9350,6 +11788,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10770,6 +13314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11260,23 +13910,129 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." } }, "title": "Outputs (step)" @@ -12325,6 +15081,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12632,6 +15494,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12925,6 +15893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13240,6 +16314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13892,6 +17072,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14208,6 +17494,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14380,6 +17772,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14465,6 +17963,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14545,6 +18149,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15112,6 +18822,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15411,6 +19227,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/step_v3.schema.json b/common/src/schemas/output_schemas/step_v3.schema.json index 8960667..3de27b4 100644 --- a/common/src/schemas/output_schemas/step_v3.schema.json +++ b/common/src/schemas/output_schemas/step_v3.schema.json @@ -22,6 +22,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -74,6 +180,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -134,6 +346,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -350,6 +668,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -673,6 +1097,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2093,6 +2623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2583,6 +3219,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3648,6 +4390,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3955,13 +4803,119 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", "default": false }, "outputs": { @@ -4248,6 +5202,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4563,6 +5623,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5215,6 +6381,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5531,6 +6803,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5703,6 +7081,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5788,6 +7272,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5868,6 +7458,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6435,6 +8131,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6734,6 +8536,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/output_schemas/test_v3.schema.json b/common/src/schemas/output_schemas/test_v3.schema.json index 9d86ed1..19f99ec 100644 --- a/common/src/schemas/output_schemas/test_v3.schema.json +++ b/common/src/schemas/output_schemas/test_v3.schema.json @@ -8,6 +8,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -621,6 +727,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -673,6 +885,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -733,6 +1051,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -949,6 +1373,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1272,6 +1802,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -2692,6 +3328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3182,25 +3924,131 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, "title": "Outputs (step)" }, "variables": { @@ -4247,6 +5095,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4554,6 +5508,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4847,6 +5907,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5162,6 +6328,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5814,6 +7086,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6130,31 +7508,137 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, "patternProperties": { "^[A-Za-z0-9_]+$": { "type": "string", @@ -6302,6 +7786,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6387,6 +7977,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6467,6 +8163,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7034,6 +8836,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7333,6 +9241,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8098,26 +10112,132 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" }, "variables": { "type": "object", @@ -8150,6 +10270,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8210,6 +10436,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8426,6 +10758,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -8749,6 +11187,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10169,6 +12713,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -10659,22 +13309,128 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { - "type": "string", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", "description": "Runtime expression for a user-defined output value." } }, @@ -11724,6 +14480,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12031,6 +14893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12324,6 +15292,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12639,6 +15713,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13291,6 +16471,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13607,6 +16893,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13779,6 +17171,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13864,6 +17362,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13944,6 +17548,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14511,6 +18221,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14810,6 +18626,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index 6cfab64..ee42c31 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -1205,6 +1205,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1257,6 +1363,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1317,6 +1529,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1533,6 +1851,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -1856,6 +2280,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3276,6 +3806,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -3766,6 +4402,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -4831,6 +5573,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5138,6 +5986,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5431,6 +6385,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -5746,6 +6806,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6398,6 +7564,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6714,6 +7986,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6886,6 +8264,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -6971,6 +8455,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7051,6 +8641,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7618,6 +9314,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -7917,6 +9719,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9113,6 +11021,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9165,6 +11179,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9225,6 +11345,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9441,6 +11667,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -9764,6 +12096,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11184,6 +13622,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -11674,6 +14218,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -12739,6 +15389,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13046,6 +15802,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13339,6 +16201,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -13654,6 +16622,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14306,6 +17380,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14622,6 +17802,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14794,6 +18080,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -14879,86 +18271,298 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "loadVariables", + "type": "object", + "required": [ + "loadVariables" + ], + "properties": { + "loadVariables": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "loadVariables", + "type": "string", + "description": "Load environment variables from the specified `.env` file.", + "examples": [ + ".env" + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -15526,6 +19130,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -15825,6 +19535,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21514,6 +25330,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21566,6 +25488,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21626,6 +25654,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -21842,6 +25976,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -22165,6 +26405,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -23585,6 +27931,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -24075,6 +28527,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25140,6 +29698,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25447,6 +30111,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -25740,6 +30510,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -26055,6 +30931,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -26707,6 +31689,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27023,6 +32111,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27195,91 +32389,303 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ + "examples": [ { - "type": "boolean", - "nullable": true + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "type": "object", + "required": [ + "stopRecord" + ], + "properties": { + "stopRecord": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "stopRecord", + "description": "Stop the current recording.", + "anyOf": [ + { + "type": "boolean", + "nullable": true + } + ], + "examples": [ + true + ] + } + }, + "title": "stopRecord" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -27360,6 +32766,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -27927,6 +33439,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -28226,6 +33844,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29422,6 +35146,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29474,6 +35304,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29534,6 +35470,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -29750,6 +35792,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -30073,6 +36221,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31493,6 +37747,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -31983,6 +38343,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -33048,6 +39514,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -33355,6 +39927,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -33648,6 +40326,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -33963,6 +40747,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -34615,6 +41505,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -34931,6 +41927,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -35103,6 +42205,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -35188,6 +42396,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -35268,6 +42582,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -35835,6 +43255,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -36134,6 +43660,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -37486,6 +45118,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -38099,6 +45837,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -38151,6 +45995,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -38211,6 +46161,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -38427,6 +46483,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -38750,6 +46912,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -40170,6 +48438,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -40660,6 +49034,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -41725,6 +50205,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -42032,6 +50618,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -42325,6 +51017,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -42640,6 +51438,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43292,6 +52196,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43608,6 +52618,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43780,6 +52896,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -43865,86 +53087,298 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "loadVariables", + "type": "object", + "required": [ + "loadVariables" + ], + "properties": { + "loadVariables": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "loadVariables", + "type": "string", + "description": "Load environment variables from the specified `.env` file.", + "examples": [ + ".env" + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -44512,6 +53946,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -44811,6 +54351,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -45576,6 +55222,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -45628,6 +55380,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -45688,6 +55546,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -45904,6 +55868,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -46227,6 +56297,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -47647,6 +57823,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -48137,6 +58419,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -49202,6 +59590,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -49509,6 +60003,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -49802,6 +60402,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -50117,6 +60823,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -50769,6 +61581,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -51085,6 +62003,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -51257,91 +62281,303 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ + "examples": [ { - "type": "boolean", - "nullable": true + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "type": "object", + "required": [ + "stopRecord" + ], + "properties": { + "stopRecord": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "stopRecord", + "description": "Stop the current recording.", + "anyOf": [ + { + "type": "boolean", + "nullable": true + } + ], + "examples": [ + true + ] + } + }, + "title": "stopRecord" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" } - ], - "examples": [ - true - ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -51422,6 +62658,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -51989,6 +63331,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -52288,6 +63736,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -54150,6 +65704,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -54763,6 +66423,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -54815,6 +66581,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -54875,6 +66747,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -55091,6 +67069,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -55414,6 +67498,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -56834,6 +69024,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -57324,6 +69620,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -58389,6 +70791,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -58696,6 +71204,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -58989,6 +71603,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -59304,6 +72024,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -59956,6 +72782,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -60272,6 +73204,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -60444,6 +73482,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -60529,6 +73673,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -60609,6 +73859,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -61176,6 +74532,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -61475,6 +74937,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62240,6 +75808,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62292,6 +75966,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62352,6 +76132,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62568,6 +76454,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -62891,6 +76883,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -64311,6 +78409,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -64801,6 +79005,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -65866,6 +80176,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -66173,6 +80589,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -66466,6 +80988,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -66781,6 +81409,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -67433,6 +82167,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -67749,6 +82589,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -67921,6 +82867,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -68006,86 +83058,298 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "loadVariables", + "type": "object", + "required": [ + "loadVariables" + ], + "properties": { + "loadVariables": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "loadVariables", + "type": "string", + "description": "Load environment variables from the specified `.env` file.", + "examples": [ + ".env" + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -68653,6 +83917,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -68952,6 +84322,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -71435,6 +86911,112 @@ } ] }, + "sourceLocation_v3": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "description": "Tracks the original source location of a test or step for inline editing support. This is a read-only property populated during test detection.", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "spec_v3": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "specification", @@ -72046,6 +87628,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -72659,6 +88347,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -72711,6 +88505,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -72771,6 +88671,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -72987,6 +88993,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -73310,6 +89422,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -74730,6 +90948,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -75220,6 +91544,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -76285,6 +92715,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -76592,6 +93128,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -76885,6 +93527,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -77200,6 +93948,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -77852,6 +94706,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -78168,6 +95128,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -78340,6 +95406,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -78425,6 +95597,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -78505,6 +95783,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -79072,6 +96456,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -79371,6 +96861,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80136,6 +97732,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80188,6 +97890,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80248,6 +98056,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80464,6 +98378,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -80787,6 +98807,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -82207,6 +100333,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -82697,6 +100929,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -83762,6 +102100,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -84069,6 +102513,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -84362,6 +102912,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -84677,6 +103333,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -85329,6 +104091,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -85645,6 +104513,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -85817,6 +104791,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -85902,86 +104982,298 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "title": "loadVariables", - "type": "object", - "required": [ - "loadVariables" - ], - "properties": { - "loadVariables": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "loadVariables", - "type": "string", - "description": "Load environment variables from the specified `.env` file.", "examples": [ - ".env" - ] - } - } - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "loadVariables", + "type": "object", + "required": [ + "loadVariables" + ], + "properties": { + "loadVariables": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "loadVariables", + "type": "string", + "description": "Load environment variables from the specified `.env` file.", + "examples": [ + ".env" + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } ] }, - "stepId": { - "type": "string", - "description": "ID of the step." - }, "description": { "type": "string", "description": "Description of the step." @@ -86549,6 +105841,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -86848,6 +106246,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -87893,6 +107397,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -87945,6 +107555,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -88005,6 +107721,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -88221,6 +108043,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -88544,6 +108472,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -89964,6 +109998,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -90454,6 +110594,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -91519,6 +111765,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -91826,6 +112178,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -92119,6 +112577,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -92434,6 +112998,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93086,6 +113756,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93402,6 +114178,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93574,6 +114456,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93659,6 +114647,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -93739,6 +114833,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -94306,6 +115506,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -94605,6 +115911,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -95112,6 +116524,112 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "description": "Source location information for inline tests. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the test." @@ -95725,6 +117243,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -95777,6 +117401,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -95837,6 +117567,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -96053,6 +117889,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -96376,6 +118318,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -97796,6 +119844,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -98286,6 +120440,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -99351,6 +121611,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -99658,6 +122024,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -99951,6 +122423,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -100266,6 +122844,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -100918,6 +123602,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -101234,6 +124024,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -101406,6 +124302,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -101491,6 +124493,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -101571,6 +124679,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -102138,6 +125352,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -102437,6 +125757,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103202,6 +126628,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103254,6 +126786,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103314,6 +126952,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103530,6 +127274,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -103853,6 +127703,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -105273,6 +129229,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -105763,6 +129825,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -106828,6 +130996,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -107135,6 +131409,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -107428,6 +131808,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -107743,6 +132229,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -108395,6 +132987,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -108711,6 +133409,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -108883,90 +133687,302 @@ "type": "string", "description": "ID of the step." }, - "description": { - "type": "string", - "description": "Description of the step." - }, - "unsafe": { - "type": "boolean", - "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", - "default": false - }, - "outputs": { + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "type": "object", + "required": [ + "stopRecord" + ], + "properties": { + "stopRecord": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "stopRecord", + "description": "Stop the current recording.", + "anyOf": [ + { + "type": "boolean", + "nullable": true + } + ], + "examples": [ + true + ] + } + }, + "title": "stopRecord" + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", "type": "object", - "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { "type": "string", - "description": "Runtime expression for a user-defined output value." - } - }, - "title": "Outputs (step)" - }, - "variables": { - "type": "object", - "description": "Environment variables to set from user-defined expressions.", - "default": {}, - "patternProperties": { - "^[A-Za-z0-9_]+$": { + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { "type": "string", - "description": "Runtime expression for a user-defined output value." + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true } }, - "title": "Variables (step)" - }, - "breakpoint": { - "type": "boolean", - "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", - "default": false - } - }, - "title": "Common" - }, - { - "type": "object", - "required": [ - "stopRecord" - ], - "properties": { - "stopRecord": { - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "stopRecord", - "description": "Stop the current recording.", - "anyOf": [ + "examples": [ { - "type": "boolean", - "nullable": true + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" } - ], - "examples": [ - true ] - } - }, - "title": "stopRecord" - } - ] - }, - { - "allOf": [ - { - "type": "object", - "dynamicDefaults": { - "stepId": "uuid" - }, - "properties": { - "$schema": { - "description": "JSON Schema for this object.", - "type": "string", - "enum": [ - "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" - ] - }, - "stepId": { - "type": "string", - "description": "ID of the step." }, "description": { "type": "string", @@ -109048,6 +134064,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -109615,6 +134737,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." @@ -109914,6 +135142,112 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "description": "Source location information for inline steps. Read-only, populated during detection.", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/src_schemas/sourceLocation_v3.schema.json b/common/src/schemas/src_schemas/sourceLocation_v3.schema.json new file mode 100644 index 0000000..6d22dba --- /dev/null +++ b/common/src/schemas/src_schemas/sourceLocation_v3.schema.json @@ -0,0 +1,106 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "sourceLocation", + "description": "Tracks the original source location of a test or step for inline editing support. This is a read-only property populated during test detection.", + "type": "object", + "readOnly": true, + "additionalProperties": false, + "properties": { + "file": { + "type": "string", + "description": "Absolute path to the source file containing this test or step.", + "readOnly": true + }, + "startLine": { + "type": "integer", + "description": "1-based line number where this test or step starts.", + "minimum": 1, + "readOnly": true + }, + "endLine": { + "type": "integer", + "description": "1-based line number where this test or step ends.", + "minimum": 1, + "readOnly": true + }, + "startColumn": { + "type": "integer", + "description": "1-based column number where this test or step starts on startLine.", + "minimum": 1, + "readOnly": true + }, + "endColumn": { + "type": "integer", + "description": "1-based column number where this test or step ends on endLine.", + "minimum": 1, + "readOnly": true + }, + "startOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step starts.", + "minimum": 0, + "readOnly": true + }, + "endOffset": { + "type": "integer", + "description": "0-based character offset from the beginning of the file where this test or step ends.", + "minimum": 0, + "readOnly": true + }, + "originalText": { + "type": "string", + "description": "The original text content of this test or step as found in the source file.", + "readOnly": true + }, + "isInline": { + "type": "boolean", + "description": "Whether this test or step was detected from inline comments within a content file (true) or from a standalone spec file (false).", + "default": false, + "readOnly": true + }, + "isAutoDetected": { + "type": "boolean", + "description": "Whether this step was auto-detected from markup patterns (true) or explicitly defined in an inline comment (false). Only applicable to steps.", + "default": false, + "readOnly": true + }, + "commentFormat": { + "type": "string", + "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", + "enum": [ + "htmlComment", + "jsxComment", + "linkReference" + ], + "readOnly": true + } + }, + "examples": [ + { + "file": "/path/to/docs/getting-started.md", + "startLine": 42, + "endLine": 45, + "startColumn": 1, + "endColumn": 3, + "startOffset": 1250, + "endOffset": 1350, + "originalText": "", + "isInline": true, + "isAutoDetected": false, + "commentFormat": "htmlComment" + }, + { + "file": "/path/to/docs/tutorial.md", + "startLine": 78, + "endLine": 78, + "startColumn": 1, + "endColumn": 45, + "startOffset": 2100, + "endOffset": 2145, + "originalText": "[example link](https://example.com)", + "isInline": true, + "isAutoDetected": true, + "commentFormat": "htmlComment" + } + ] +} diff --git a/common/src/schemas/src_schemas/step_v3.schema.json b/common/src/schemas/src_schemas/step_v3.schema.json index b5f66a2..f5b9d12 100644 --- a/common/src/schemas/src_schemas/step_v3.schema.json +++ b/common/src/schemas/src_schemas/step_v3.schema.json @@ -17,6 +17,9 @@ "stepId": { "$ref": "#/components/schemas/stepId" }, + "sourceLocation": { + "$ref": "#/components/schemas/sourceLocation" + }, "description": { "$ref": "#/components/schemas/description" }, @@ -46,6 +49,10 @@ "type": "string", "description": "ID of the step." }, + "sourceLocation": { + "$ref": "sourceLocation_v3.schema.json#", + "description": "Source location information for inline steps. Read-only, populated during detection." + }, "description": { "type": "string", "description": "Description of the step." diff --git a/common/src/schemas/src_schemas/test_v3.schema.json b/common/src/schemas/src_schemas/test_v3.schema.json index 6a78b5c..34d26d6 100644 --- a/common/src/schemas/src_schemas/test_v3.schema.json +++ b/common/src/schemas/src_schemas/test_v3.schema.json @@ -8,6 +8,10 @@ "type": "string", "description": "Unique identifier for the test." }, + "sourceLocation": { + "$ref": "sourceLocation_v3.schema.json#", + "description": "Source location information for inline tests. Read-only, populated during detection." + }, "description": { "type": "string", "description": "Description of the test." diff --git a/resolver/package-lock.json b/resolver/package-lock.json index 5cf2118..10020cc 100644 --- a/resolver/package-lock.json +++ b/resolver/package-lock.json @@ -222,6 +222,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1372,6 +1373,7 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } diff --git a/resolver/src/utils.js b/resolver/src/utils.js index 481d609..e3e2bde 100644 --- a/resolver/src/utils.js +++ b/resolver/src/utils.js @@ -25,6 +25,8 @@ exports.cleanTemp = cleanTemp; exports.calculatePercentageDifference = calculatePercentageDifference; exports.fetchFile = fetchFile; exports.isRelativeUrl = isRelativeUrl; +exports.calculateSourceLocation = calculateSourceLocation; +exports.detectCommentFormat = detectCommentFormat; function isRelativeUrl(url) { try { @@ -37,6 +39,114 @@ function isRelativeUrl(url) { } } +/** + * Calculate line and column numbers from a character offset in content. + * Lines are 1-based, columns are 1-based. + * + * @param {string} content - The full content string + * @param {number} startOffset - 0-based character offset for start position + * @param {number} endOffset - 0-based character offset for end position + * @returns {Object} Object with startLine, endLine, startColumn, endColumn + */ +function calculateLineColumn(content, startOffset, endOffset) { + let startLine = 1; + let startColumn = 1; + let endLine = 1; + let endColumn = 1; + let currentOffset = 0; + + const lines = content.split('\n'); + + for (let i = 0; i < lines.length; i++) { + const lineLength = lines[i].length + 1; // +1 for the newline character + const lineEnd = currentOffset + lineLength; + + // Check if startOffset falls within this line + if (startOffset >= currentOffset && startOffset < lineEnd) { + startLine = i + 1; + startColumn = startOffset - currentOffset + 1; + } + + // Check if endOffset falls within this line + if (endOffset >= currentOffset && endOffset <= lineEnd) { + endLine = i + 1; + endColumn = endOffset - currentOffset + 1; + } + + currentOffset = lineEnd; + + // If we've passed both offsets, we can stop + if (currentOffset > endOffset) { + break; + } + } + + return { startLine, endLine, startColumn, endColumn }; +} + +/** + * Detect the comment format used for an inline test or step. + * + * @param {string} originalText - The original text of the match + * @returns {string} One of: 'htmlComment', 'jsxComment', 'linkReference' + */ +function detectCommentFormat(originalText) { + if (!originalText || typeof originalText !== 'string') { + return 'htmlComment'; + } + + const trimmed = originalText.trim(); + + // HTML-style comments: + if (trimmed.startsWith(' + const htmlMatch = content.match(//); + if (htmlMatch) { + content = htmlMatch[1].trim(); + } + + // Remove JSX comment wrapper: {/* test/step ... */} + const jsxMatch = content.match(/\{\s*\/\*\s*(?:test|step)\s+([\s\S]*?)\s*\*\/\s*\}/); + if (jsxMatch) { + content = jsxMatch[1].trim(); + } + + // Remove link reference wrapper: [comment]: # (test/step ...) + const linkMatch = content.match(/\[comment\]:\s*#\s*\((?:test|step)\s+([\s\S]*?)\s*\)/); + if (linkMatch) { + content = linkMatch[1].trim(); + } + + // Now detect the syntax format of the content + + // JSON: starts with { or contains "key": pattern + if (content.startsWith('{') || /^"?\w+"?\s*:\s*[{\["']/.test(content)) { + return 'json'; + } + + // XML-style attributes: key="value" or key=value patterns without JSON structure + if (/^\w+\s*=\s*["']?[^{]/.test(content) || /^\w+\s*=\s*(?:true|false|\d+)/.test(content)) { + return 'xml'; + } + + // YAML: contains key: value patterns with newlines or indentation + if (/^\w+:\s*\n/.test(content) || /\n\s+\w+:/.test(content)) { + return 'yaml'; + } + + // YAML: simple key: value without JSON braces + if (/^\w+:\s+[^{]/.test(content) && !content.includes('{')) { + return 'yaml'; + } + + // Default to JSON if we can't detect + return 'json'; +} + +/** + * Serialize content to the specified syntax format. + * + * @param {Object} obj - The object to serialize + * @param {'json'|'yaml'|'xml'} syntaxFormat - The syntax format to use + * @param {'test'|'step'} type - Whether this is a test or step + * @returns {string} The serialized content (without comment wrappers) + */ +function serializeToSyntax(obj, syntaxFormat, type) { + switch (syntaxFormat) { + case 'xml': + // XML-style attributes: key="value" key=boolean + const attrs = []; + for (const [key, value] of Object.entries(obj)) { + if (typeof value === 'string') { + attrs.push(`${key}="${value}"`); + } else if (typeof value === 'boolean' || typeof value === 'number') { + attrs.push(`${key}=${value}`); + } else { + // Complex values fall back to JSON + attrs.push(`${key}=${JSON.stringify(value)}`); + } + } + return attrs.join(' '); + + case 'yaml': + // Multiline YAML format + const yamlLines = []; + for (const [key, value] of Object.entries(obj)) { + if (typeof value === 'string') { + // Quote strings that contain special characters + if (/[:#\[\]{}|>!&*?'"]/.test(value) || value.includes('\n')) { + yamlLines.push(`${key}: "${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`); + } else { + yamlLines.push(`${key}: ${value}`); + } + } else if (typeof value === 'boolean' || typeof value === 'number') { + yamlLines.push(`${key}: ${value}`); + } else if (Array.isArray(value)) { + // Arrays use YAML flow style + yamlLines.push(`${key}: ${JSON.stringify(value)}`); + } else if (typeof value === 'object' && value !== null) { + // Nested objects use indented YAML + yamlLines.push(`${key}:`); + for (const [subKey, subValue] of Object.entries(value)) { + if (typeof subValue === 'string') { + if (/[:#\[\]{}|>!&*?'"]/.test(subValue) || subValue.includes('\n')) { + yamlLines.push(` ${subKey}: "${subValue.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`); + } else { + yamlLines.push(` ${subKey}: ${subValue}`); + } + } else { + yamlLines.push(` ${subKey}: ${JSON.stringify(subValue)}`); + } + } + } else { + yamlLines.push(`${key}: ${JSON.stringify(value)}`); + } + } + return yamlLines.join('\n'); + + case 'json': + default: + return JSON.stringify(obj); + } +} + /** * Serialize a step to inline comment format based on the detected or default comment format. * @@ -18,12 +142,17 @@ const crypto = require('crypto'); * @param {Object} options.step - The step object to serialize * @param {string} options.commentFormat - Comment format: 'htmlComment', 'jsxComment', or 'linkReference' * @param {string} options.fileExtension - File extension (e.g., '.md', '.jsx') for fallback format detection + * @param {string} options.originalText - Original text of the inline statement (for syntax detection) + * @param {'json'|'yaml'|'xml'} options.syntaxFormat - Explicit syntax format override * @returns {string} The serialized inline step comment */ -function serializeStepToInline({ step, commentFormat, fileExtension }) { +function serializeStepToInline({ step, commentFormat, fileExtension, originalText, syntaxFormat }) { // Determine the comment format to use const format = commentFormat || getDefaultCommentFormat(fileExtension); + // Detect or use provided syntax format + const syntax = syntaxFormat || detectSyntaxFormat(originalText) || 'json'; + // Clone step and remove sourceLocation (it's read-only metadata, not serializable content) const stepToSerialize = { ...step }; delete stepToSerialize.sourceLocation; @@ -52,20 +181,31 @@ function serializeStepToInline({ step, commentFormat, fileExtension }) { stepContent = `${actionKey}: ${JSON.stringify(actionValue)}`; } } else { - // Full format: JSON object - stepContent = JSON.stringify(stepToSerialize); + // Full format: use detected/specified syntax + stepContent = serializeToSyntax(stepToSerialize, syntax, 'step'); } + // Check if content is multiline + const isMultiline = stepContent.includes('\n'); + // Wrap in appropriate comment format switch (format) { case 'jsxComment': + if (isMultiline) { + return `{/* step\n${stepContent}\n*/}`; + } return `{/* step ${stepContent} */}`; case 'linkReference': - // Link reference format doesn't support arbitrary step content - // Fall back to HTML comment - return ``; + // Link reference format doesn't support multiline well, fall back to JSON + if (isMultiline) { + return `[comment]: # (step ${JSON.stringify(stepToSerialize)})`; + } + return `[comment]: # (step ${stepContent})`; case 'htmlComment': default: + if (isMultiline) { + return ``; + } return ``; } } @@ -77,11 +217,16 @@ function serializeStepToInline({ step, commentFormat, fileExtension }) { * @param {Object} options.test - The test object to serialize (only metadata, not steps) * @param {string} options.commentFormat - Comment format to use * @param {string} options.fileExtension - File extension for fallback format detection + * @param {string} options.originalText - Original text of the inline statement (for syntax detection) + * @param {'json'|'yaml'|'xml'} options.syntaxFormat - Explicit syntax format override * @returns {string} The serialized inline test comment */ -function serializeTestToInline({ test, commentFormat, fileExtension }) { +function serializeTestToInline({ test, commentFormat, fileExtension, originalText, syntaxFormat }) { const format = commentFormat || getDefaultCommentFormat(fileExtension); + // Detect or use provided syntax format + const syntax = syntaxFormat || detectSyntaxFormat(originalText) || 'json'; + // Clone test and remove non-serializable properties const testToSerialize = {}; if (test.testId) testToSerialize.testId = test.testId; @@ -91,14 +236,23 @@ function serializeTestToInline({ test, commentFormat, fileExtension }) { if (test.before) testToSerialize.before = test.before; if (test.after) testToSerialize.after = test.after; - // Always use JSON syntax for consistency with step serialization - const testContent = JSON.stringify(testToSerialize); + // Use detected/specified syntax format + const testContent = serializeToSyntax(testToSerialize, syntax, 'test'); + + // Check if content is multiline + const isMultiline = testContent.includes('\n'); switch (format) { case 'jsxComment': + if (isMultiline) { + return `{/* test\n${testContent}\n*/}`; + } return `{/* test ${testContent} */}`; case 'htmlComment': default: + if (isMultiline) { + return ``; + } return ``; } } @@ -541,11 +695,12 @@ function prepareSourceUpdates({ spec, originalSpec }) { if (wasModified) { const fileUpdates = updatesByFile.get(testLoc.file) || []; - // Serialize the test declaration (without steps) + // Serialize the test declaration (without steps), preserving original syntax format const newContent = serializeTestToInline({ test, commentFormat: testLoc.commentFormat || 'htmlComment', fileExtension: path.extname(testLoc.file), + originalText: testLoc.originalText, }); // Replace the ENTIRE LINE containing the test declaration @@ -568,11 +723,12 @@ function prepareSourceUpdates({ spec, originalSpec }) { const stepLoc = firstInlineStep.sourceLocation; const fileUpdates = updatesByFile.get(stepLoc.file) || []; - // Serialize the test declaration + // Serialize the test declaration, using the first step's syntax format as a hint const newContent = serializeTestToInline({ test, commentFormat: stepLoc.commentFormat || 'htmlComment', fileExtension: path.extname(stepLoc.file), + originalText: stepLoc.originalText, // Use first step's format as hint }); // Insert on the LINE BEFORE the first step @@ -620,6 +776,7 @@ function prepareSourceUpdates({ spec, originalSpec }) { step, commentFormat: loc.commentFormat || 'htmlComment', fileExtension: path.extname(loc.file), + // No originalText for auto-detected - use default JSON format }); // Insert on the line after the original content @@ -631,11 +788,12 @@ function prepareSourceUpdates({ spec, originalSpec }) { isAutoDetectedConversion: true, }); } else { - // Explicit inline step: replace the ENTIRE LINE + // Explicit inline step: replace the ENTIRE LINE, preserving original syntax format const newContent = serializeStepToInline({ step, commentFormat: loc.commentFormat, fileExtension: path.extname(loc.file), + originalText: loc.originalText, }); fileUpdates.push({ @@ -676,6 +834,8 @@ function hasAutoDetectedSteps(spec) { module.exports = { serializeStepToInline, serializeTestToInline, + detectSyntaxFormat, + serializeToSyntax, getDefaultCommentFormat, canSerializeAsSimple, hasTestMetadata, From 0386267a3035bbff2bb98aa48f95a7daafb74483 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 5 Dec 2025 11:30:50 -0800 Subject: [PATCH 10/90] Debugger first pass --- cli/src/cli/builder/DebugRunner.mjs | 689 ++++++++++++++++++++++++++++ cli/src/cli/builder/TestBuilder.mjs | 102 ++++ cli/src/cli/builder/schemaUtils.mjs | 33 ++ 3 files changed, 824 insertions(+) create mode 100644 cli/src/cli/builder/DebugRunner.mjs diff --git a/cli/src/cli/builder/DebugRunner.mjs b/cli/src/cli/builder/DebugRunner.mjs new file mode 100644 index 0000000..d3bfa6a --- /dev/null +++ b/cli/src/cli/builder/DebugRunner.mjs @@ -0,0 +1,689 @@ +/** + * Debug runner component - interactive step-by-step test execution + * Allows users to run tests with a visible browser, edit steps, and retry on failure + */ + +import React from 'react'; +const { useState, useEffect, useCallback, useRef } = React; +import { Box, Text, useInput, useApp } from 'ink'; +import SelectInput from 'ink-select-input'; +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); + +import StepEditor from './StepEditor.mjs'; +import { StatusBar, JsonPreview, ConfirmPrompt } from './components.mjs'; +import { + getStepTypes, + getCommonStepProperties, + createDefaultStep, + getBrowserActions, + getStepActionType, + stepRequiresBrowser, +} from './schemaUtils.mjs'; + +/** + * Find the index of the first browser-requiring step + * @param {Array} steps - Array of steps + * @returns {number} Index of first browser step, or -1 if none + */ +function findFirstBrowserStepIndex(steps) { + return steps.findIndex((step) => stepRequiresBrowser(step)); +} + +/** + * Check if a goTo step exists before the given index + * @param {Array} steps - Array of steps + * @param {number} beforeIndex - Index to check before + * @returns {boolean} + */ +function hasGoToBefore(steps, beforeIndex) { + for (let i = 0; i < beforeIndex; i++) { + if (steps[i].goTo !== undefined) { + return true; + } + } + return false; +} + +/** + * Debug Runner component + * @param {Object} props + * @param {Object} props.test - The test to run + * @param {number} props.testIndex - Index of the test in the spec + * @param {Function} props.onComplete - Called when debug session completes with updated test + * @param {Function} props.onCancel - Called when user cancels debug session + */ +const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { + const { exit } = useApp(); + + // Phase states + const [phase, setPhase] = useState('init'); // 'init', 'checkGoTo', 'addGoTo', 'running', 'stepPreview', 'stepEdit', 'stepResult', 'complete', 'error' + + // Runner state + const [runner, setRunner] = useState(null); + const [cleanup, setCleanup] = useState(null); + const [runStep, setRunStep] = useState(null); + const [initError, setInitError] = useState(null); + + // Test state (mutable copy) + const [localTest, setLocalTest] = useState(() => JSON.parse(JSON.stringify(test))); + + // Step execution state + const [currentStepIndex, setCurrentStepIndex] = useState(0); + const [stepResult, setStepResult] = useState(null); + const [isExecuting, setIsExecuting] = useState(false); + + // Results tracking + const [results, setResults] = useState({ passed: 0, failed: 0 }); + + // Auto-advance timer ref + const autoAdvanceTimer = useRef(null); + + // Cleanup on unmount + useEffect(() => { + return () => { + if (autoAdvanceTimer.current) { + clearTimeout(autoAdvanceTimer.current); + } + if (cleanup) { + cleanup().catch(() => {}); + } + }; + }, [cleanup]); + + // Initialize runner + useEffect(() => { + if (phase !== 'init') return; + + const initRunner = async () => { + try { + const { getRunner } = require('doc-detective-core'); + const result = await getRunner({ headless: false }); + setRunner(result.runner); + setCleanup(() => result.cleanup); + setRunStep(() => result.runStep); + + // Check if we need a goTo step + const steps = localTest.steps || []; + const firstBrowserIndex = findFirstBrowserStepIndex(steps); + + if (firstBrowserIndex >= 0 && !hasGoToBefore(steps, firstBrowserIndex)) { + setPhase('checkGoTo'); + } else { + setPhase('stepPreview'); + } + } catch (error) { + setInitError(error.message || 'Failed to initialize browser'); + setPhase('error'); + } + }; + + initRunner(); + }, [phase, localTest.steps]); + + // Handle escape key + useInput((input, key) => { + if (key.escape) { + if (phase === 'stepEdit') { + setPhase('stepPreview'); + } else if (phase === 'stepPreview' || phase === 'stepResult') { + // Confirm exit + setPhase('confirmExit'); + } + } + }); + + // Cleanup and exit helper + const cleanupAndExit = useCallback(async (callback) => { + if (autoAdvanceTimer.current) { + clearTimeout(autoAdvanceTimer.current); + } + if (cleanup) { + try { + await cleanup(); + } catch (e) { + // Ignore cleanup errors + } + } + callback(); + }, [cleanup]); + + // Execute current step + const executeStep = useCallback(async () => { + if (!runStep || !runner) return; + + const steps = localTest.steps || []; + const step = steps[currentStepIndex]; + + if (!step) { + setPhase('complete'); + return; + } + + setIsExecuting(true); + setStepResult(null); + + try { + const result = await runStep({ + config: {}, + context: {}, + step, + driver: runner, + metaValues: {}, + options: {}, + }); + + setStepResult(result); + + if (result.status === 'PASS') { + setResults((prev) => ({ ...prev, passed: prev.passed + 1 })); + setPhase('stepResult'); + + // Auto-advance after 1.5 seconds + autoAdvanceTimer.current = setTimeout(() => { + if (currentStepIndex < steps.length - 1) { + setCurrentStepIndex((prev) => prev + 1); + setPhase('stepPreview'); + } else { + setPhase('complete'); + } + }, 1500); + } else { + setResults((prev) => ({ ...prev, failed: prev.failed + 1 })); + setPhase('stepResult'); + } + } catch (error) { + setStepResult({ + status: 'FAIL', + description: error.message || 'Step execution failed', + }); + setResults((prev) => ({ ...prev, failed: prev.failed + 1 })); + setPhase('stepResult'); + } finally { + setIsExecuting(false); + } + }, [runStep, runner, localTest.steps, currentStepIndex]); + + // Add goTo step at the specified index + const addGoToStep = useCallback((url, insertIndex) => { + const newSteps = [...(localTest.steps || [])]; + newSteps.splice(insertIndex, 0, { goTo: url }); + setLocalTest({ ...localTest, steps: newSteps }); + }, [localTest]); + + // Update a step + const updateStep = useCallback((stepIndex, updatedStep) => { + const newSteps = [...(localTest.steps || [])]; + newSteps[stepIndex] = updatedStep; + setLocalTest({ ...localTest, steps: newSteps }); + }, [localTest]); + + // Get step display info + const getStepDisplay = (step) => { + const actionType = getStepActionType(step); + const actionValue = actionType ? step[actionType] : null; + const displayValue = typeof actionValue === 'string' + ? actionValue.substring(0, 50) + : typeof actionValue === 'object' + ? JSON.stringify(actionValue).substring(0, 50) + : ''; + return { actionType: actionType || 'unknown', displayValue }; + }; + + const steps = localTest.steps || []; + const totalSteps = steps.length; + const currentStep = steps[currentStepIndex]; + + // Error phase + if (phase === 'error') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Error'], + validationStatus: false, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red', bold: true }, '❌ Initialization Error') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red' }, initError) + ), + React.createElement(SelectInput, { + items: [{ label: '← Back', value: 'back' }], + onSelect: () => onCancel(), + }) + ); + } + + // Init phase - loading + if (phase === 'init') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Initializing'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, '🚀 Starting browser...') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'This may take a moment. The browser will open in visible mode.' + ) + ); + } + + // Check goTo phase + if (phase === 'checkGoTo') { + const firstBrowserIndex = findFirstBrowserStepIndex(steps); + const firstBrowserStep = steps[firstBrowserIndex]; + const { actionType } = getStepDisplay(firstBrowserStep); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Navigation Required'], + validationStatus: false, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'yellow', bold: true }, '⚠️ No Navigation Step Found') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + null, + `The first browser action is "${actionType}" (step ${firstBrowserIndex + 1}), but there's no goTo step before it.` + ) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray' }, + 'Browser actions require navigating to a URL first.' + ) + ), + React.createElement(SelectInput, { + items: [ + { label: '➕ Add a goTo step', value: 'addGoTo' }, + { label: '← Cancel debug session', value: 'cancel' }, + ], + onSelect: (item) => { + if (item.value === 'addGoTo') { + setPhase('addGoTo'); + } else { + cleanupAndExit(onCancel); + } + }, + }) + ); + } + + // Add goTo phase + if (phase === 'addGoTo') { + const firstBrowserIndex = findFirstBrowserStepIndex(steps); + + return React.createElement(GoToInput, { + onSubmit: (url) => { + addGoToStep(url, firstBrowserIndex); + setPhase('stepPreview'); + }, + onCancel: () => setPhase('checkGoTo'), + }); + } + + // Step preview phase + if (phase === 'stepPreview' && currentStep) { + const { actionType, displayValue } = getStepDisplay(currentStep); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + hint: 'Run, edit, or stop the debug session', + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, `Step ${currentStepIndex + 1}: `), + React.createElement(Text, { color: 'white' }, actionType), + displayValue && React.createElement(Text, { color: 'gray' }, `: ${displayValue}`) + ), + React.createElement( + Box, + { marginBottom: 1, borderStyle: 'single', borderColor: 'gray', paddingX: 1 }, + React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(Text, { color: 'gray', dimColor: true }, 'Step JSON:'), + React.createElement(Text, { color: 'white' }, JSON.stringify(currentStep, null, 2)) + ) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: '▶️ Run this step', value: 'run' }, + { label: '✏️ Edit step before running', value: 'edit' }, + { label: '⛔ Stop debug session', value: 'stop' }, + ], + onSelect: (item) => { + if (item.value === 'run') { + executeStep(); + } else if (item.value === 'edit') { + setPhase('stepEdit'); + } else if (item.value === 'stop') { + cleanupAndExit(() => onComplete(localTest)); + } + }, + }) + ); + } + + // Step edit phase + if (phase === 'stepEdit' && currentStep) { + return React.createElement(StepEditor, { + step: currentStep, + stepIndex: currentStepIndex, + onChange: (updatedStep) => { + updateStep(currentStepIndex, updatedStep); + }, + onSave: (updatedStep) => { + updateStep(currentStepIndex, updatedStep); + setPhase('stepPreview'); + }, + onCancel: () => setPhase('stepPreview'), + onDelete: () => { + // Don't allow deletion during debug - would mess up step indices + setPhase('stepPreview'); + }, + }); + } + + // Step result phase + if (phase === 'stepResult') { + const passed = stepResult?.status === 'PASS'; + const { actionType } = getStepDisplay(currentStep); + + if (passed) { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + validationStatus: true, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'green', bold: true }, '✅ Step Passed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `"${actionType}" completed successfully.`) + ), + stepResult?.description && React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, stepResult.description) + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + currentStepIndex < totalSteps - 1 + ? 'Auto-advancing to next step...' + : 'Test complete! Finishing up...' + ) + ); + } else { + // Failed - show error and options + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + validationStatus: false, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red', bold: true }, '❌ Step Failed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `"${actionType}" failed to execute.`) + ), + stepResult?.description && React.createElement( + Box, + { marginBottom: 1, paddingX: 1, borderStyle: 'single', borderColor: 'red' }, + React.createElement(Text, { color: 'red' }, stepResult.description) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: '✏️ Edit step and retry', value: 'editRetry' }, + { label: '⛔ Stop debug session', value: 'stop' }, + ], + onSelect: (item) => { + if (item.value === 'editRetry') { + // Decrement failed count since we're retrying + setResults((prev) => ({ ...prev, failed: prev.failed - 1 })); + setPhase('stepEdit'); + } else { + cleanupAndExit(() => onComplete(localTest)); + } + }, + }) + ); + } + } + + // Confirm exit phase + if (phase === 'confirmExit') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Confirm Exit'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'yellow', bold: true }, '⚠️ Stop Debug Session?') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'This will close the browser and return to the editor.') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Current progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: 'Stop and save changes', value: 'stop' }, + { label: 'Continue debugging', value: 'continue' }, + ], + onSelect: (item) => { + if (item.value === 'stop') { + cleanupAndExit(() => onComplete(localTest)); + } else { + setPhase('stepPreview'); + } + }, + }) + ); + } + + // Complete phase + if (phase === 'complete') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Complete'], + validationStatus: results.failed === 0, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: results.failed === 0 ? 'green' : 'yellow', bold: true }, + results.failed === 0 ? '🎉 All Steps Passed!' : '⚠️ Debug Session Complete' + ) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `Results: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray' }, + 'Any changes made during debugging will be preserved.' + ) + ), + React.createElement(SelectInput, { + items: [ + { label: '← Return to editor', value: 'done' }, + ], + onSelect: () => { + cleanupAndExit(() => onComplete(localTest)); + }, + }) + ); + } + + // Fallback for executing state + if (isExecuting) { + const { actionType } = getStepDisplay(currentStep); + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, `⏳ Running "${actionType}"...`) + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Check the browser window for action execution.' + ) + ); + } + + // Default fallback + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(Text, { color: 'gray' }, 'Loading...') + ); +}; + +/** + * GoTo URL input component + */ +const GoToInput = ({ onSubmit, onCancel }) => { + const [url, setUrl] = useState('https://'); + + useInput((input, key) => { + if (key.escape) { + onCancel(); + return; + } + if (key.return) { + if (url.trim() && (url.startsWith('http://') || url.startsWith('https://'))) { + onSubmit(url.trim()); + } + return; + } + if (key.backspace || key.delete) { + setUrl((prev) => prev.slice(0, -1)); + return; + } + if (!key.ctrl && !key.meta && input) { + setUrl((prev) => prev + input); + } + }); + + const isValid = url.trim() && (url.startsWith('http://') || url.startsWith('https://')); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', 'Add goTo Step'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🌐 Add Navigation Step') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'Enter the URL to navigate to before running browser actions:') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, 'URL: '), + React.createElement(Text, { color: isValid ? 'green' : 'white' }, url), + React.createElement(Text, { color: 'gray' }, '█') + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'Press Enter to confirm, Esc to cancel' + ) + ), + !isValid && url.length > 0 && React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'yellow' }, + 'URL must start with http:// or https://' + ) + ) + ); +}; + +export default DebugRunner; diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index 97870dd..05cf848 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -19,6 +19,7 @@ import { } from './schemaUtils.mjs'; import TestEditor from './TestEditor.mjs'; import FieldEditor from './FieldEditor.mjs'; +import DebugRunner from './DebugRunner.mjs'; import { StatusBar, JsonPreview, SimpleTextInput, LabeledTextInput, ConfirmPrompt, DescriptiveItem, NoIndicator, ScrollableSelect } from './components.mjs'; // Import source file utilities for inline test handling @@ -136,6 +137,7 @@ const TestBuilder = ({ const [spec, setSpec] = useState(initialSpec || createDefaultSpec()); const [editingTestIndex, setEditingTestIndex] = useState(null); const [editingField, setEditingField] = useState(null); + const [debugTestIndex, setDebugTestIndex] = useState(null); const [saveDir, setSaveDir] = useState(outputDir); const [showValidationWarning, setShowValidationWarning] = useState(!isValid && isEditing); @@ -352,6 +354,85 @@ const TestBuilder = ({ }); } + // Select test to debug + if (phase === 'selectDebugTest') { + const runnableTests = (spec.tests || []) + .map((test, index) => ({ test, index })) + .filter(({ test }) => (test.steps || []).length > 0); + + const items = runnableTests.map(({ test, index }) => { + const description = test.description || `Test ${index + 1}`; + const stepCount = (test.steps || []).length; + return { + label: `${index + 1}. ${description.substring(0, 40)}${description.length > 40 ? '...' : ''} (${stepCount} steps)`, + value: index, + }; + }); + + items.push({ label: '← Back', value: 'back' }); + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName, 'Select Test to Debug'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '🚀 Select Test to Debug') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray' }, + 'Choose a test to run step-by-step with a visible browser:' + ) + ), + React.createElement(SelectInput, { + items, + onSelect: (item) => { + if (item.value === 'back') { + setPhase('menu'); + } else { + setDebugTestIndex(item.value); + setPhase('debugRun'); + } + }, + }) + ); + } + + // Debug run phase + if (phase === 'debugRun' && debugTestIndex !== null) { + const testToDebug = spec.tests?.[debugTestIndex]; + + if (!testToDebug) { + setPhase('menu'); + setDebugTestIndex(null); + return null; + } + + return React.createElement(DebugRunner, { + test: testToDebug, + testIndex: debugTestIndex, + onComplete: (updatedTest) => { + // Update the test with any changes made during debugging + const newTests = [...(spec.tests || [])]; + newTests[debugTestIndex] = updatedTest; + setSpec({ ...spec, tests: newTests }); + setDebugTestIndex(null); + setPhase('menu'); + }, + onCancel: () => { + setDebugTestIndex(null); + setPhase('menu'); + }, + }); + } + // Edit spec metadata field if (phase === 'editMeta' && editingField) { const fieldDef = specFields.find((f) => f.name === editingField); @@ -894,6 +975,16 @@ const TestBuilder = ({ value: 'addTest', }); + // Debug/run option - only show if there are tests with steps + const hasRunnableTests = tests.some((t) => (t.steps || []).length > 0); + if (hasRunnableTests) { + menuItems.push({ label: '─────── Debug ──────────', value: `none_${menuIndex++}` }); + menuItems.push({ + label: '🚀 Run and debug test', + value: 'debugTest', + }); + } + menuItems.push({ label: '─────── Save/Exit ──────', value: `none_${menuIndex++}` }); // Actions @@ -980,6 +1071,17 @@ const TestBuilder = ({ case 'addTest': setPhase('addTest'); break; + case 'debugTest': + // If only one test with steps, go directly to debug + const runnableTests = tests.filter((t) => (t.steps || []).length > 0); + if (runnableTests.length === 1) { + const runnableIndex = tests.findIndex((t) => (t.steps || []).length > 0); + setDebugTestIndex(runnableIndex); + setPhase('debugRun'); + } else { + setPhase('selectDebugTest'); + } + break; case 'preview': setPhase('preview'); break; diff --git a/cli/src/cli/builder/schemaUtils.mjs b/cli/src/cli/builder/schemaUtils.mjs index 9ab40f5..54473b1 100644 --- a/cli/src/cli/builder/schemaUtils.mjs +++ b/cli/src/cli/builder/schemaUtils.mjs @@ -503,6 +503,36 @@ export function createDefaultSpec(specId = '') { }; } +/** + * Get the list of action types that require a browser + * These actions need a goTo step before they can execute + * @returns {string[]} Array of browser-requiring action types + */ +export function getBrowserActions() { + return ['type', 'find', 'click', 'dragAndDrop', 'screenshot', 'record']; +} + +/** + * Get the action type from a step object + * @param {Object} step - The step object + * @returns {string|null} The action type or null if not found + */ +export function getStepActionType(step) { + const commonProps = Object.keys(getCommonStepProperties()); + const stepTypes = getStepTypes(); + return Object.keys(step).find((k) => stepTypes.includes(k) && !commonProps.includes(k)) || null; +} + +/** + * Check if a step requires a browser to execute + * @param {Object} step - The step object + * @returns {boolean} True if the step requires a browser + */ +export function stepRequiresBrowser(step) { + const actionType = getStepActionType(step); + return getBrowserActions().includes(actionType); +} + export default { getStepTypes, getStepTypeSchema, @@ -523,4 +553,7 @@ export default { createDefaultStep, createDefaultTest, createDefaultSpec, + getBrowserActions, + getStepActionType, + stepRequiresBrowser, }; From bf2b795061997f2393e7a30bd48e41aaa81ca315 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 5 Dec 2025 11:35:37 -0800 Subject: [PATCH 11/90] Move to local dev depedencies --- cli/package-lock.json | 19474 ++-------------------------------------- cli/package.json | 3 +- 2 files changed, 551 insertions(+), 18926 deletions(-) diff --git a/cli/package-lock.json b/cli/package-lock.json index 67d44e4..14c99cd 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -12,12 +12,14 @@ "@ffmpeg-installer/ffmpeg": "^1.1.0", "axios": "^1.13.2", "doc-detective-common": "^3.5.1", - "doc-detective-core": "^3.5.1", + "doc-detective-core": "file:../core", + "doc-detective-resolver": "^3.6.1", "ink": "^6.5.1", "ink-select-input": "^6.2.0", "ink-spinner": "^5.0.0", "js-yaml": "^4.1.1", "react": "^19.2.0", + "yaml": "^2.8.2", "yargs": "^17.7.2" }, "bin": { @@ -30,6 +32,74 @@ "mocha": "^11.7.5" } }, + "../core": { + "name": "doc-detective-core", + "version": "3.6.2", + "hasInstallScript": true, + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "@ffmpeg-installer/ffmpeg": "^1.1.0", + "@puppeteer/browsers": "^2.10.13", + "ajv": "^8.17.1", + "appium": "^3.1.1", + "appium-chromium-driver": "^2.0.3", + "appium-geckodriver": "^2.1.2", + "appium-safari-driver": "^4.1.2", + "axios": "^1.13.2", + "doc-detective-common": "^3.6.0", + "doc-detective-resolver": "^3.6.1", + "dotenv": "^17.2.3", + "geckodriver": "^6.1.0", + "jq-web": "^0.6.2", + "json-schema-faker": "^0.5.9", + "pixelmatch": "^7.1.0", + "pngjs": "^7.0.0", + "posthog-node": "^5.15.0", + "tree-kill": "^1.2.2", + "webdriverio": "^9.21.0" + }, + "devDependencies": { + "depcheck": "^1.4.7", + "express": "^5.2.1", + "mocha": "^11.7.5", + "semver": "^7.7.3" + }, + "optionalDependencies": { + "@ffmpeg-installer/darwin-arm64": "4.1.5", + "@ffmpeg-installer/darwin-x64": "4.1.0", + "@ffmpeg-installer/linux-arm": "4.1.3", + "@ffmpeg-installer/linux-arm64": "4.1.4", + "@ffmpeg-installer/linux-ia32": "4.1.0", + "@ffmpeg-installer/linux-x64": "4.1.0", + "@ffmpeg-installer/win32-ia32": "4.1.0", + "@ffmpeg-installer/win32-x64": "4.1.0", + "@img/sharp-darwin-arm64": "^0.34.5", + "@img/sharp-darwin-x64": "^0.34.5", + "@img/sharp-libvips-darwin-arm64": "^1.2.4", + "@img/sharp-libvips-darwin-x64": "^1.2.4", + "@img/sharp-libvips-linux-arm": "^1.2.4", + "@img/sharp-libvips-linux-arm64": "^1.2.4", + "@img/sharp-libvips-linux-ppc64": "^1.2.4", + "@img/sharp-libvips-linux-riscv64": "^1.2.4", + "@img/sharp-libvips-linux-s390x": "^1.2.4", + "@img/sharp-libvips-linux-x64": "^1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "^1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "^1.2.4", + "@img/sharp-linux-arm": "^0.34.5", + "@img/sharp-linux-arm64": "^0.34.5", + "@img/sharp-linux-ppc64": "^0.34.5", + "@img/sharp-linux-riscv64": "^0.34.5", + "@img/sharp-linux-s390x": "^0.34.5", + "@img/sharp-linux-x64": "^0.34.5", + "@img/sharp-linuxmusl-arm64": "^0.34.5", + "@img/sharp-linuxmusl-x64": "^0.34.5", + "@img/sharp-wasm32": "^0.34.5", + "@img/sharp-win32-arm64": "^0.34.5", + "@img/sharp-win32-ia32": "^0.34.5", + "@img/sharp-win32-x64": "^0.34.5" + } + }, "node_modules/@alcalzone/ansi-tokenize": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.2.tgz", @@ -71,9 +141,9 @@ } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.2.tgz", - "integrity": "sha512-54vnqDyGsDAVM0LOIdGMnfVyCN1NlqoGnHEGpMfaDBLMvClfT4j2XbJgvfuF0Ca0kxT6Gb7xUgS5W1I14QqjiQ==", + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", + "integrity": "sha512-XvEitlOaU8S+hOrMPuGyCjp6vC51K+syUN4HHrSUdSDLLWRWQJYjInU6xlSoRGCVBCfcoHxbRm+yiaYq2yFR5w==", "license": "MIT", "dependencies": { "js-yaml": "^4.1.1" @@ -85,117 +155,152 @@ "@types/json-schema": "^7.0.15" } }, - "node_modules/@appium/base-driver": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", - "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@colors/colors": "1.6.0", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.13.2", - "bluebird": "3.7.2", - "body-parser": "2.2.0", - "express": "5.1.0", - "fastest-levenshtein": "1.0.16", - "http-status-codes": "2.3.0", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "method-override": "3.0.0", - "morgan": "1.10.1", - "path-to-regexp": "8.3.0", - "serve-favicon": "2.5.1", - "source-map-support": "0.5.21", - "type-fest": "5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, + "node_modules/@ffmpeg-installer/darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz", + "integrity": "sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "license": "https://git.ffmpeg.org/gitweb/ffmpeg.git/blob_plain/HEAD:/LICENSE.md", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffmpeg-installer/darwin-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz", + "integrity": "sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "license": "LGPL-2.1", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffmpeg-installer/ffmpeg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz", + "integrity": "sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==", "optionalDependencies": { - "spdy": "4.0.2" + "@ffmpeg-installer/darwin-arm64": "4.1.5", + "@ffmpeg-installer/darwin-x64": "4.1.0", + "@ffmpeg-installer/linux-arm": "4.1.3", + "@ffmpeg-installer/linux-arm64": "4.1.4", + "@ffmpeg-installer/linux-ia32": "4.1.0", + "@ffmpeg-installer/linux-x64": "4.1.0", + "@ffmpeg-installer/win32-ia32": "4.1.0", + "@ffmpeg-installer/win32-x64": "4.1.0" } }, - "node_modules/@appium/base-driver/node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } + "node_modules/@ffmpeg-installer/linux-arm": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm/-/linux-arm-4.1.3.tgz", + "integrity": "sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==", + "cpu": [ + "arm" + ], + "hasInstallScript": true, + "license": "GPLv3", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@appium/base-driver/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } + "node_modules/@ffmpeg-installer/linux-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz", + "integrity": "sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "license": "GPLv3", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@appium/base-plugin": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", - "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/support": "^7.0.3" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } + "node_modules/@ffmpeg-installer/linux-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-ia32/-/linux-ia32-4.1.0.tgz", + "integrity": "sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==", + "cpu": [ + "ia32" + ], + "hasInstallScript": true, + "license": "GPLv3", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@appium/docutils": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", - "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", - "license": "Apache-2.0", + "node_modules/@ffmpeg-installer/linux-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz", + "integrity": "sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/win32-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-ia32/-/win32-ia32-4.1.0.tgz", + "integrity": "sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==", + "cpu": [ + "ia32" + ], + "license": "GPLv3", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ffmpeg-installer/win32-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-x64/-/win32-x64-4.1.0.tgz", + "integrity": "sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==", + "cpu": [ + "x64" + ], + "license": "GPLv3", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "dependencies": { - "@appium/support": "^7.0.3", - "chalk": "4.1.2", - "consola": "3.4.2", - "diff": "8.0.2", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "pkg-dir": "5.0.0", - "read-pkg": "5.2.0", - "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "yaml": "2.8.1", - "yargs": "18.0.0", - "yargs-parser": "22.0.0" - }, - "bin": { - "appium-docs": "bin/appium-docs.js" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" + "node": ">=12" } }, - "node_modules/@appium/docutils/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { "node": ">=12" }, @@ -203,15309 +308,168 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@appium/docutils/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=20" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@appium/docutils/node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "license": "BSD-3-Clause", + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", + "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", + "license": "MIT", "engines": { - "node": ">=0.3.1" + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/@appium/docutils/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/@appium/docutils/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@appium/docutils/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@appium/docutils/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/@appium/docutils/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/@appium/logger": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", - "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", - "license": "ISC", - "dependencies": { - "console-control-strings": "1.1.0", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "set-blocking": "2.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/@appium/logger/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@appium/schema": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", - "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "0.4.0", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/@appium/support": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", - "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/tsconfig": "^1.1.0", - "@appium/types": "^1.1.1", - "@colors/colors": "1.6.0", - "archiver": "7.0.1", - "axios": "1.13.2", - "base64-stream": "1.0.0", - "bluebird": "3.7.2", - "bplist-creator": "0.1.1", - "bplist-parser": "0.3.2", - "form-data": "4.0.4", - "get-stream": "6.0.1", - "glob": "11.0.3", - "jsftp": "2.1.3", - "klaw": "4.1.0", - "lockfile": "1.0.4", - "lodash": "4.17.21", - "log-symbols": "4.1.0", - "moment": "2.30.1", - "ncp": "2.0.0", - "pkg-dir": "5.0.0", - "plist": "3.1.0", - "pluralize": "8.0.0", - "read-pkg": "5.2.0", - "resolve-from": "5.0.0", - "sanitize-filename": "1.6.3", - "semver": "7.7.3", - "shell-quote": "1.8.3", - "source-map-support": "0.5.21", - "supports-color": "8.1.1", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "uuid": "13.0.0", - "which": "5.0.0", - "yauzl": "3.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "optionalDependencies": { - "sharp": "0.34.5" - } - }, - "node_modules/@appium/support/node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@appium/support/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@appium/support/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@appium/support/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@appium/support/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@appium/tsconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", - "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", - "license": "Apache-2.0", - "dependencies": { - "@tsconfig/node20": "20.1.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/@appium/types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", - "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/schema": "^1.0.0", - "@appium/tsconfig": "^1.1.0", - "type-fest": "5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", - "license": "MIT", - "dependencies": { - "@so-ric/colorspace": "^1.1.6", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@ffmpeg-installer/darwin-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz", - "integrity": "sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==", - "cpu": [ - "arm64" - ], - "hasInstallScript": true, - "license": "https://git.ffmpeg.org/gitweb/ffmpeg.git/blob_plain/HEAD:/LICENSE.md", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ffmpeg-installer/darwin-x64": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz", - "integrity": "sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==", - "cpu": [ - "x64" - ], - "hasInstallScript": true, - "license": "LGPL-2.1", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ffmpeg-installer/ffmpeg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz", - "integrity": "sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==", - "optionalDependencies": { - "@ffmpeg-installer/darwin-arm64": "4.1.5", - "@ffmpeg-installer/darwin-x64": "4.1.0", - "@ffmpeg-installer/linux-arm": "4.1.3", - "@ffmpeg-installer/linux-arm64": "4.1.4", - "@ffmpeg-installer/linux-ia32": "4.1.0", - "@ffmpeg-installer/linux-x64": "4.1.0", - "@ffmpeg-installer/win32-ia32": "4.1.0", - "@ffmpeg-installer/win32-x64": "4.1.0" - } - }, - "node_modules/@ffmpeg-installer/linux-arm": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm/-/linux-arm-4.1.3.tgz", - "integrity": "sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==", - "cpu": [ - "arm" - ], - "hasInstallScript": true, - "license": "GPLv3", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ffmpeg-installer/linux-arm64": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz", - "integrity": "sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==", - "cpu": [ - "arm64" - ], - "hasInstallScript": true, - "license": "GPLv3", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ffmpeg-installer/linux-ia32": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-ia32/-/linux-ia32-4.1.0.tgz", - "integrity": "sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==", - "cpu": [ - "ia32" - ], - "hasInstallScript": true, - "license": "GPLv3", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ffmpeg-installer/linux-x64": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz", - "integrity": "sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==", - "cpu": [ - "x64" - ], - "hasInstallScript": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ffmpeg-installer/win32-ia32": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-ia32/-/win32-ia32-4.1.0.tgz", - "integrity": "sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==", - "cpu": [ - "ia32" - ], - "license": "GPLv3", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ffmpeg-installer/win32-x64": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-x64/-/win32-x64-4.1.0.tgz", - "integrity": "sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==", - "cpu": [ - "x64" - ], - "license": "GPLv3", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jsep-plugin/assignment": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", - "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, - "node_modules/@jsep-plugin/regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", - "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@posthog/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.6.0.tgz", - "integrity": "sha512-Tbh8UACwbb7jFdDC7wwXHtfNzO+4wKh3VbyMHmp2UBe6w1jliJixexTJNfkqdGZm+ht3M10mcKvGGPnoZ2zLBg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6" - } - }, - "node_modules/@promptbook/utils": { - "version": "0.69.5", - "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz", - "integrity": "sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "CC-BY-4.0", - "dependencies": { - "spacetrim": "0.11.59" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.10.13", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", - "integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.4.3", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.5.0", - "semver": "^7.7.3", - "tar-fs": "^3.1.1", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@sidvind/better-ajv-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", - "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", - "license": "Apache-2.0", - "dependencies": { - "kleur": "^4.1.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "ajv": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@so-ric/colorspace": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", - "license": "MIT", - "dependencies": { - "color": "^5.0.2", - "text-hex": "1.0.x" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "license": "MIT" - }, - "node_modules/@tsconfig/node20": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", - "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "license": "MIT" - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/@types/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", - "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@wdio/config": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.20.1.tgz", - "integrity": "sha512-npl2J+rjCDJPjVySgWpciOyhWddn6s7n5sepKXLR7x1ADQHl5zUFv1dHD3jx4OQ9l6lrGQSPaofuz+7e9mu+vg==", - "license": "MIT", - "dependencies": { - "@wdio/logger": "9.18.0", - "@wdio/types": "9.20.0", - "@wdio/utils": "9.20.1", - "deepmerge-ts": "^7.0.3", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/logger": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.18.0.tgz", - "integrity": "sha512-HdzDrRs+ywAqbXGKqe1i/bLtCv47plz4TvsHFH3j729OooT5VH38ctFn5aLXgECmiAKDkmH/A6kOq2Zh5DIxww==", - "license": "MIT", - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "safe-regex2": "^5.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/logger/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wdio/protocols": { - "version": "9.16.2", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.16.2.tgz", - "integrity": "sha512-h3k97/lzmyw5MowqceAuY3HX/wGJojXHkiPXA3WlhGPCaa2h4+GovV2nJtRvknCKsE7UHA1xB5SWeI8MzloBew==", - "license": "MIT" - }, - "node_modules/@wdio/repl": { - "version": "9.16.2", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.16.2.tgz", - "integrity": "sha512-FLTF0VL6+o5BSTCO7yLSXocm3kUnu31zYwzdsz4n9s5YWt83sCtzGZlZpt7TaTzb3jVUfxuHNQDTb8UMkCu0lQ==", - "license": "MIT", - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/repl/node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@wdio/repl/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/@wdio/types": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.20.0.tgz", - "integrity": "sha512-zMmAtse2UMCSOW76mvK3OejauAdcFGuKopNRH7crI0gwKTZtvV89yXWRziz9cVXpFgfmJCjf9edxKFWdhuF5yw==", - "license": "MIT", - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/types/node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@wdio/types/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/@wdio/utils": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.20.1.tgz", - "integrity": "sha512-C/Gsy5NAatsGUF1eT9Ks/ErR52/X4YI7MSm7BtwNOw8v2Ko+SiCA5qXts61J0A7QYwOn4gfXfBZZnzSAng6G/w==", - "license": "MIT", - "dependencies": { - "@puppeteer/browsers": "^2.2.0", - "@wdio/logger": "9.18.0", - "@wdio/types": "9.20.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^7.0.3", - "edgedriver": "^6.1.2", - "geckodriver": "^5.0.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.2.24", - "mitt": "^3.0.1", - "safaridriver": "^1.0.0", - "split2": "^4.2.0", - "wait-port": "^1.1.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/@wdio/utils/node_modules/geckodriver": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-5.0.0.tgz", - "integrity": "sha512-vn7TtQ3b9VMJtVXsyWtQQl1fyBVFhQy7UvJF96kPuuJ0or5THH496AD3eUyaDD11+EqCxH9t6V+EP9soZQk4YQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@wdio/logger": "^9.1.3", - "@zip.js/zip.js": "^2.7.53", - "decamelize": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^3.3.2", - "tar-fs": "^3.0.6", - "which": "^5.0.0" - }, - "bin": { - "geckodriver": "bin/geckodriver.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@zip.js/zip.js": { - "version": "2.8.11", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.11.tgz", - "integrity": "sha512-0fztsk/0ryJ+2PPr9EyXS5/Co7OK8q3zY/xOoozEWaUsL5x+C0cyZ4YyMuUffOO2Dx/rAdq4JMPqW0VUtm+vzA==", - "license": "BSD-3-Clause", - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-escapes": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.1.tgz", - "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/base-plugin": "^3.0.4", - "@appium/docutils": "^2.1.2", - "@appium/logger": "^2.0.2", - "@appium/schema": "^1.0.0", - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@sidvind/better-ajv-errors": "4.0.0", - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "argparse": "2.0.1", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.13.2", - "bluebird": "3.7.2", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "ora": "5.4.1", - "package-changed": "3.0.0", - "resolve-from": "5.0.0", - "semver": "7.7.3", - "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "winston": "3.18.3", - "wrap-ansi": "7.0.0", - "ws": "8.18.3", - "yaml": "2.8.1" - }, - "bin": { - "appium": "index.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/appium-chromium-driver/-/appium-chromium-driver-2.0.3.tgz", - "integrity": "sha512-qT3ldg0EFW9yuU0E/11ME4e7BIx5A17Ti+zvv1JR9soflJd5ruCY+j+6IP18RCKwYgBk152ey85cD6JvotL0Jw==", - "hasShrinkwrap": true, - "license": "Apache-2.0", - "dependencies": { - "appium-chromedriver": "^8.0.0", - "bluebird": "^3.7.2", - "lodash": "^4.17.21" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "peerDependencies": { - "appium": "^3.0.0-rc.2" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/base-driver": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", - "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@colors/colors": "1.6.0", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.13.2", - "bluebird": "3.7.2", - "body-parser": "2.2.0", - "express": "5.1.0", - "fastest-levenshtein": "1.0.16", - "http-status-codes": "2.3.0", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "method-override": "3.0.0", - "morgan": "1.10.1", - "path-to-regexp": "8.3.0", - "serve-favicon": "2.5.1", - "source-map-support": "0.5.21", - "type-fest": "5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "optionalDependencies": { - "spdy": "4.0.2" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/base-plugin": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", - "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/support": "^7.0.3" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/docutils": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", - "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.3", - "chalk": "4.1.2", - "consola": "3.4.2", - "diff": "8.0.2", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "pkg-dir": "5.0.0", - "read-pkg": "5.2.0", - "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "yaml": "2.8.1", - "yargs": "18.0.0", - "yargs-parser": "22.0.0" - }, - "bin": { - "appium-docs": "bin/appium-docs.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/logger": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", - "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", - "license": "ISC", - "dependencies": { - "console-control-strings": "1.1.0", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "set-blocking": "2.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/schema": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", - "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "0.4.0", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/support": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", - "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/tsconfig": "^1.1.0", - "@appium/types": "^1.1.1", - "@colors/colors": "1.6.0", - "archiver": "7.0.1", - "axios": "1.13.2", - "base64-stream": "1.0.0", - "bluebird": "3.7.2", - "bplist-creator": "0.1.1", - "bplist-parser": "0.3.2", - "form-data": "4.0.4", - "get-stream": "6.0.1", - "glob": "11.0.3", - "jsftp": "2.1.3", - "klaw": "4.1.0", - "lockfile": "1.0.4", - "lodash": "4.17.21", - "log-symbols": "4.1.0", - "moment": "2.30.1", - "ncp": "2.0.0", - "pkg-dir": "5.0.0", - "plist": "3.1.0", - "pluralize": "8.0.0", - "read-pkg": "5.2.0", - "resolve-from": "5.0.0", - "sanitize-filename": "1.6.3", - "semver": "7.7.3", - "shell-quote": "1.8.3", - "source-map-support": "0.5.21", - "supports-color": "8.1.1", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "uuid": "13.0.0", - "which": "5.0.0", - "yauzl": "3.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "optionalDependencies": { - "sharp": "0.34.5" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/tsconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", - "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", - "license": "Apache-2.0", - "dependencies": { - "@tsconfig/node20": "20.1.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/@appium/types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", - "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/schema": "^1.0.0", - "@appium/tsconfig": "^1.1.0", - "type-fest": "5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/appium-chromium-driver/node_modules/@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@so-ric/colorspace": "^1.1.6", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-chromium-driver/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-chromium-driver/node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-chromium-driver/node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-chromium-driver/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-chromium-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/appium-chromium-driver/node_modules/@sidvind/better-ajv-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", - "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "kleur": "^4.1.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "ajv": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/@so-ric/colorspace": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "color": "^5.0.2", - "text-hex": "1.0.x" - } - }, - "node_modules/appium-chromium-driver/node_modules/@tsconfig/node20": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", - "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/appium-chromium-driver/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/appium-adb": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.0.3.tgz", - "integrity": "sha512-fJIEikjVoKsj9PfM2iPBn4kEMHy78ZY6PBC4pTiSv0rlAgxnScQW9OLm2l4wEaE8ODwnY2zJZDHehEGZ2b79fg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.0-rc.1", - "async-lock": "^1.0.0", - "asyncbox": "^3.0.0", - "bluebird": "^3.4.7", - "ini": "^6.0.0", - "lodash": "^4.0.0", - "lru-cache": "^11.1.0", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^3.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/appium-chromedriver": { - "version": "8.0.21", - "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.21.tgz", - "integrity": "sha512-l5SUc+VAykdFvwWwA7C6Kg4SdH45d1N/lyGvj/60b8W3Fv/HhfLDM0b1yhjH+leO7bBjS80iQI+z+P+1Fk5ydw==", - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^10.0.0-rc.2", - "@appium/support": "^7.0.0-rc.1", - "@xmldom/xmldom": "^0.x", - "appium-adb": "^14.0.0", - "asyncbox": "^3.0.0", - "axios": "^1.6.5", - "bluebird": "^3.5.1", - "compare-versions": "^6.0.0", - "lodash": "^4.17.4", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^3.0.0", - "xpath": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "extraneous": true, - "license": "Python-2.0" - }, - "node_modules/appium-chromium-driver/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-chromium-driver/node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/base64-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", - "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-chromium-driver/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-chromium-driver/node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/appium-chromium-driver/node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/appium-chromium-driver/node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/cliui/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/color": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", - "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "color-convert": "^3.1.3", - "color-string": "^2.1.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-chromium-driver/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/color-string": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", - "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-chromium-driver/node_modules/color-string/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/appium-chromium-driver/node_modules/color/node_modules/color-convert": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", - "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/color/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/appium-chromium-driver/node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-chromium-driver/node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-chromium-driver/node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-chromium-driver/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-chromium-driver/node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-chromium-driver/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "extraneous": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/appium-chromium-driver/node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-chromium-driver/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-chromium-driver/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-chromium-driver/node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "dependencies": { - "readable-stream": "^1.0.31" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/ftp-response-parser/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/appium-chromium-driver/node_modules/ftp-response-parser/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-chromium-driver/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/ini": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-chromium-driver/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "ftp-response-parser": "^1.0.1", - "once": "^1.4.0", - "parse-listing": "^1.1.3", - "stream-combiner": "^0.2.2", - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/jsftp/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/appium-chromium-driver/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/klaw": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", - "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", - "license": "MIT", - "engines": { - "node": ">=14.14.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/appium-chromium-driver/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" - } - }, - "node_modules/appium-chromium-driver/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-chromium-driver/node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "license": "MIT", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-chromium-driver/node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/method-override/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-chromium-driver/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/appium-chromium-driver/node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/morgan": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", - "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", - "license": "MIT", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.1.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/appium-chromium-driver/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/appium-chromium-driver/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/appium-chromium-driver/node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/appium-chromium-driver/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/package-changed": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", - "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", - "extraneous": true, - "license": "ISC", - "dependencies": { - "commander": "^6.2.0" - }, - "bin": { - "package-changed": "bin/package-changed.js" - } - }, - "node_modules/appium-chromium-driver/node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/appium-chromium-driver/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/parse-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "engines": { - "node": ">=0.6.21" - } - }, - "node_modules/appium-chromium-driver/node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-chromium-driver/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-chromium-driver/node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/appium-chromium-driver/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-chromium-driver/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-chromium-driver/node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-chromium-driver/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-chromium-driver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-chromium-driver/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-chromium-driver/node_modules/serve-favicon": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", - "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", - "license": "MIT", - "dependencies": { - "etag": "~1.8.1", - "fresh": "~0.5.2", - "ms": "~2.1.3", - "parseurl": "~1.3.2", - "safe-buffer": "~5.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/serve-favicon/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-chromium-driver/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/appium-chromium-driver/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/appium-chromium-driver/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0" - }, - "node_modules/appium-chromium-driver/node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/appium-chromium-driver/node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-chromium-driver/node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-chromium-driver/node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/appium-chromium-driver/node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/appium-chromium-driver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "extraneous": true, - "license": "0BSD" - }, - "node_modules/appium-chromium-driver/node_modules/type-fest": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", - "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "license": "MIT or GPL-2.0", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/appium-chromium-driver/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/appium-chromium-driver/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "optional": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/appium-chromium-driver/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/winston": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", - "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.8", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-chromium-driver/node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-chromium-driver/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/appium-chromium-driver/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/appium-chromium-driver/node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/xpath": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", - "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", - "license": "MIT", - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/appium-chromium-driver/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-chromium-driver/node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "extraneous": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "extraneous": true, - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-chromium-driver/node_modules/yargs/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-chromium-driver/node_modules/yauzl/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-chromium-driver/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-chromium-driver/node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/appium-geckodriver/-/appium-geckodriver-2.1.1.tgz", - "integrity": "sha512-+/RXmDgbPACzNTzbYGyUm/vLJSvlY2ehg6BU0fNycjBURv9Nmp07nNOUcfWQ99aR6OnoETeQNTgrl8qM8DXVug==", - "hasShrinkwrap": true, - "license": "Apache-2.0", - "dependencies": { - "appium-adb": "^14.0.0", - "asyncbox": "^3.0.0", - "axios": "^1.7.7", - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "portscanner": "2.2.0", - "semver": "^7.6.3", - "source-map-support": "^0.x", - "tar-stream": "^3.1.7", - "teen_process": "^3.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "peerDependencies": { - "appium": "^3.0.0-rc.2" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/base-driver": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", - "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@colors/colors": "1.6.0", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.13.2", - "bluebird": "3.7.2", - "body-parser": "2.2.0", - "express": "5.1.0", - "fastest-levenshtein": "1.0.16", - "http-status-codes": "2.3.0", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "method-override": "3.0.0", - "morgan": "1.10.1", - "path-to-regexp": "8.3.0", - "serve-favicon": "2.5.1", - "source-map-support": "0.5.21", - "type-fest": "5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "optionalDependencies": { - "spdy": "4.0.2" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/base-plugin": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", - "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/support": "^7.0.3" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/docutils": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", - "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.3", - "chalk": "4.1.2", - "consola": "3.4.2", - "diff": "8.0.2", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "pkg-dir": "5.0.0", - "read-pkg": "5.2.0", - "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "yaml": "2.8.1", - "yargs": "18.0.0", - "yargs-parser": "22.0.0" - }, - "bin": { - "appium-docs": "bin/appium-docs.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/docutils/node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/logger": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", - "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", - "license": "ISC", - "dependencies": { - "console-control-strings": "1.1.0", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "set-blocking": "2.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/schema": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", - "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "0.4.0", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/support": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", - "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/tsconfig": "^1.1.0", - "@appium/types": "^1.1.1", - "@colors/colors": "1.6.0", - "archiver": "7.0.1", - "axios": "1.13.2", - "base64-stream": "1.0.0", - "bluebird": "3.7.2", - "bplist-creator": "0.1.1", - "bplist-parser": "0.3.2", - "form-data": "4.0.4", - "get-stream": "6.0.1", - "glob": "11.0.3", - "jsftp": "2.1.3", - "klaw": "4.1.0", - "lockfile": "1.0.4", - "lodash": "4.17.21", - "log-symbols": "4.1.0", - "moment": "2.30.1", - "ncp": "2.0.0", - "pkg-dir": "5.0.0", - "plist": "3.1.0", - "pluralize": "8.0.0", - "read-pkg": "5.2.0", - "resolve-from": "5.0.0", - "sanitize-filename": "1.6.3", - "semver": "7.7.3", - "shell-quote": "1.8.3", - "source-map-support": "0.5.21", - "supports-color": "8.1.1", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "uuid": "13.0.0", - "which": "5.0.0", - "yauzl": "3.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "optionalDependencies": { - "sharp": "0.34.5" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/support/node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/tsconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", - "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", - "license": "Apache-2.0", - "dependencies": { - "@tsconfig/node20": "20.1.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/@appium/types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", - "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/schema": "^1.0.0", - "@appium/tsconfig": "^1.1.0", - "type-fest": "5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-geckodriver/node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-geckodriver/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/appium-geckodriver/node_modules/@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", - "license": "MIT", - "dependencies": { - "@so-ric/colorspace": "^1.1.6", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/appium-geckodriver/node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-geckodriver/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-geckodriver/node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/appium-geckodriver/node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-geckodriver/node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-geckodriver/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-geckodriver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/appium-geckodriver/node_modules/@sidvind/better-ajv-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", - "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", - "license": "Apache-2.0", - "dependencies": { - "kleur": "^4.1.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "ajv": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/@so-ric/colorspace": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", - "license": "MIT", - "dependencies": { - "color": "^5.0.2", - "text-hex": "1.0.x" - } - }, - "node_modules/appium-geckodriver/node_modules/@tsconfig/node20": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", - "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/appium-geckodriver/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/appium": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.1.tgz", - "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/base-plugin": "^3.0.4", - "@appium/docutils": "^2.1.2", - "@appium/logger": "^2.0.2", - "@appium/schema": "^1.0.0", - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@sidvind/better-ajv-errors": "4.0.0", - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "argparse": "2.0.1", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.13.2", - "bluebird": "3.7.2", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "ora": "5.4.1", - "package-changed": "3.0.0", - "resolve-from": "5.0.0", - "semver": "7.7.3", - "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "winston": "3.18.3", - "wrap-ansi": "7.0.0", - "ws": "8.18.3", - "yaml": "2.8.1" - }, - "bin": { - "appium": "index.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/appium-adb": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.0.3.tgz", - "integrity": "sha512-fJIEikjVoKsj9PfM2iPBn4kEMHy78ZY6PBC4pTiSv0rlAgxnScQW9OLm2l4wEaE8ODwnY2zJZDHehEGZ2b79fg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.0-rc.1", - "async-lock": "^1.0.0", - "asyncbox": "^3.0.0", - "bluebird": "^3.4.7", - "ini": "^6.0.0", - "lodash": "^4.0.0", - "lru-cache": "^11.1.0", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^3.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/appium/node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/archiver-utils/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/appium-geckodriver/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-geckodriver/node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/base64-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", - "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/appium-geckodriver/node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-geckodriver/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-geckodriver/node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/appium-geckodriver/node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/appium-geckodriver/node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/cliui/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/color": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", - "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", - "license": "MIT", - "dependencies": { - "color-convert": "^3.1.3", - "color-string": "^2.1.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-geckodriver/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/color-string": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", - "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-geckodriver/node_modules/color-string/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/appium-geckodriver/node_modules/color/node_modules/color-convert": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", - "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/appium-geckodriver/node_modules/color/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/appium-geckodriver/node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-geckodriver/node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver/node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-geckodriver/node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/appium-geckodriver/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-geckodriver/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-geckodriver/node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-geckodriver/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/appium-geckodriver/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/appium-geckodriver/node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/appium-geckodriver/node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/appium-geckodriver/node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, - "node_modules/appium-geckodriver/node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-geckodriver/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-geckodriver/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/appium-geckodriver/node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-geckodriver/node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "dependencies": { - "readable-stream": "^1.0.31" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/appium-geckodriver/node_modules/ftp-response-parser/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/ftp-response-parser/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/appium-geckodriver/node_modules/ftp-response-parser/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/appium-geckodriver/node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-geckodriver/node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-geckodriver/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/ini": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/appium-geckodriver/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-geckodriver/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "license": "ISC", - "dependencies": { - "lodash.isfinite": "^3.3.2" - } - }, - "node_modules/appium-geckodriver/node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-geckodriver/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "ftp-response-parser": "^1.0.1", - "once": "^1.4.0", - "parse-listing": "^1.1.3", - "stream-combiner": "^0.2.2", - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/jsftp/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/appium-geckodriver/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/appium-geckodriver/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/klaw": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", - "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", - "license": "MIT", - "engines": { - "node": ">=14.14.0" - } - }, - "node_modules/appium-geckodriver/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-geckodriver/node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/appium-geckodriver/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" - } - }, - "node_modules/appium-geckodriver/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-geckodriver/node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-geckodriver/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "license": "MIT", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-geckodriver/node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/method-override/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-geckodriver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-geckodriver/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/appium-geckodriver/node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-geckodriver/node_modules/morgan": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", - "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", - "license": "MIT", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.1.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-geckodriver/node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/appium-geckodriver/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/appium-geckodriver/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/appium-geckodriver/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/appium-geckodriver/node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/appium-geckodriver/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/package-changed": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", - "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", - "license": "ISC", - "dependencies": { - "commander": "^6.2.0" - }, - "bin": { - "package-changed": "bin/package-changed.js" - } - }, - "node_modules/appium-geckodriver/node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/appium-geckodriver/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/parse-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "engines": { - "node": ">=0.6.21" - } - }, - "node_modules/appium-geckodriver/node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-geckodriver/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-geckodriver/node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/appium-geckodriver/node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/appium-geckodriver/node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "license": "MIT", - "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/portscanner/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/appium-geckodriver/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/appium-geckodriver/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-geckodriver/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-geckodriver/node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-geckodriver/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/appium-geckodriver/node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-geckodriver/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-geckodriver/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-geckodriver/node_modules/serve-favicon": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", - "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", - "license": "MIT", - "dependencies": { - "etag": "~1.8.1", - "fresh": "~0.5.2", - "ms": "~2.1.3", - "parseurl": "~1.3.2", - "safe-buffer": "~5.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-geckodriver/node_modules/serve-favicon/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/serve-favicon/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-geckodriver/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/appium-geckodriver/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/appium-geckodriver/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/appium-geckodriver/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0" - }, - "node_modules/appium-geckodriver/node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/appium-geckodriver/node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-geckodriver/node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-geckodriver/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/appium-geckodriver/node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/appium-geckodriver/node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/appium-geckodriver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/appium-geckodriver/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-geckodriver/node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/appium-geckodriver/node_modules/teen_process": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.3.tgz", - "integrity": "sha512-pYAojbLkaqXHpgze5AEdchW71OKownDPpqYpLTQsU/pUGMv3zr4yo2mSv/NnRAkRmsrNF2BP9byh2MVk9Y5H9A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/appium-geckodriver/node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/appium-geckodriver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "extraneous": true, - "license": "0BSD" - }, - "node_modules/appium-geckodriver/node_modules/type-fest": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", - "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-geckodriver/node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "license": "MIT or GPL-2.0", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/appium-geckodriver/node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/appium-geckodriver/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/appium-geckodriver/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-geckodriver/node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "optional": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/appium-geckodriver/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/appium-geckodriver/node_modules/winston": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", - "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.8", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-geckodriver/node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-geckodriver/node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-geckodriver/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/appium-geckodriver/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/appium-geckodriver/node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/appium-geckodriver/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-geckodriver/node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "license": "MIT", - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/appium-geckodriver/node_modules/yargs/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/appium-geckodriver/node_modules/yargs/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-geckodriver/node_modules/yauzl/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-geckodriver/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-geckodriver/node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/appium-safari-driver/-/appium-safari-driver-4.1.0.tgz", - "integrity": "sha512-dC+A+W9gwKOEDeogfAwtLVieYk7KfldJ52ac8bZvws5pfMFOCSiuUhvtSClujnxcalb/zLBhnIeijCsWq3V3SA==", - "hasShrinkwrap": true, - "license": "Apache-2.0", - "dependencies": { - "asyncbox": "^3.0.0", - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "node-simctl": "^8.0.0", - "portscanner": "2.2.0", - "source-map-support": "^0.x", - "teen_process": "^3.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "peerDependencies": { - "appium": "^3.0.0-rc.2" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/base-driver": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", - "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@colors/colors": "1.6.0", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.13.2", - "bluebird": "3.7.2", - "body-parser": "2.2.0", - "express": "5.1.0", - "fastest-levenshtein": "1.0.16", - "http-status-codes": "2.3.0", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "method-override": "3.0.0", - "morgan": "1.10.1", - "path-to-regexp": "8.3.0", - "serve-favicon": "2.5.1", - "source-map-support": "0.5.21", - "type-fest": "5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "optionalDependencies": { - "spdy": "4.0.2" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/base-plugin": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", - "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/support": "^7.0.3" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/docutils": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", - "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", - "license": "Apache-2.0", - "dependencies": { - "@appium/support": "^7.0.3", - "chalk": "4.1.2", - "consola": "3.4.2", - "diff": "8.0.2", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "pkg-dir": "5.0.0", - "read-pkg": "5.2.0", - "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "yaml": "2.8.1", - "yargs": "18.0.0", - "yargs-parser": "22.0.0" - }, - "bin": { - "appium-docs": "bin/appium-docs.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/docutils/node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/logger": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", - "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", - "license": "ISC", - "dependencies": { - "console-control-strings": "1.1.0", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "set-blocking": "2.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/schema": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", - "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", - "license": "Apache-2.0", - "dependencies": { - "json-schema": "0.4.0", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/support": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", - "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/tsconfig": "^1.1.0", - "@appium/types": "^1.1.1", - "@colors/colors": "1.6.0", - "archiver": "7.0.1", - "axios": "1.13.2", - "base64-stream": "1.0.0", - "bluebird": "3.7.2", - "bplist-creator": "0.1.1", - "bplist-parser": "0.3.2", - "form-data": "4.0.4", - "get-stream": "6.0.1", - "glob": "11.0.3", - "jsftp": "2.1.3", - "klaw": "4.1.0", - "lockfile": "1.0.4", - "lodash": "4.17.21", - "log-symbols": "4.1.0", - "moment": "2.30.1", - "ncp": "2.0.0", - "pkg-dir": "5.0.0", - "plist": "3.1.0", - "pluralize": "8.0.0", - "read-pkg": "5.2.0", - "resolve-from": "5.0.0", - "sanitize-filename": "1.6.3", - "semver": "7.7.3", - "shell-quote": "1.8.3", - "source-map-support": "0.5.21", - "supports-color": "8.1.1", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "uuid": "13.0.0", - "which": "5.0.0", - "yauzl": "3.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - }, - "optionalDependencies": { - "sharp": "0.34.5" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/support/node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/tsconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", - "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", - "license": "Apache-2.0", - "dependencies": { - "@tsconfig/node20": "20.1.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/@appium/types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", - "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/schema": "^1.0.0", - "@appium/tsconfig": "^1.1.0", - "type-fest": "5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-safari-driver/node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/appium-safari-driver/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/appium-safari-driver/node_modules/@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", - "license": "MIT", - "dependencies": { - "@so-ric/colorspace": "^1.1.6", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/appium-safari-driver/node_modules/@sidvind/better-ajv-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", - "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", - "license": "Apache-2.0", - "dependencies": { - "kleur": "^4.1.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "ajv": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/@so-ric/colorspace": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", - "license": "MIT", - "dependencies": { - "color": "^5.0.2", - "text-hex": "1.0.x" - } - }, - "node_modules/appium-safari-driver/node_modules/@tsconfig/node20": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", - "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/appium-safari-driver/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/appium-safari-driver/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/appium": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.1.tgz", - "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/base-plugin": "^3.0.4", - "@appium/docutils": "^2.1.2", - "@appium/logger": "^2.0.2", - "@appium/schema": "^1.0.0", - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@sidvind/better-ajv-errors": "4.0.0", - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "argparse": "2.0.1", - "async-lock": "1.4.1", - "asyncbox": "3.0.0", - "axios": "1.13.2", - "bluebird": "3.7.2", - "lilconfig": "3.1.3", - "lodash": "4.17.21", - "lru-cache": "11.2.2", - "ora": "5.4.1", - "package-changed": "3.0.0", - "resolve-from": "5.0.0", - "semver": "7.7.3", - "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "winston": "3.18.3", - "wrap-ansi": "7.0.0", - "ws": "8.18.3", - "yaml": "2.8.1" - }, - "bin": { - "appium": "index.js" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/appium/node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/appium-safari-driver/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-safari-driver/node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/appium-safari-driver/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/appium-safari-driver/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/base64-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", - "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/appium-safari-driver/node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-safari-driver/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-safari-driver/node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/appium-safari-driver/node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/appium-safari-driver/node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/cliui/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/color": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", - "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", - "license": "MIT", - "dependencies": { - "color-convert": "^3.1.3", - "color-string": "^2.1.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-safari-driver/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/color-string": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", - "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/appium-safari-driver/node_modules/color-string/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/appium-safari-driver/node_modules/color/node_modules/color-convert": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", - "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/appium-safari-driver/node_modules/color/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/appium-safari-driver/node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-safari-driver/node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver/node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-safari-driver/node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/appium-safari-driver/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium-safari-driver/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/appium-safari-driver/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/appium-safari-driver/node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/appium-safari-driver/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-safari-driver/node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/appium-safari-driver/node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/appium-safari-driver/node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/appium-safari-driver/node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, - "node_modules/appium-safari-driver/node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-safari-driver/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-safari-driver/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/appium-safari-driver/node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/appium-safari-driver/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-safari-driver/node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "dependencies": { - "readable-stream": "^1.0.31" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/appium-safari-driver/node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-safari-driver/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-safari-driver/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-safari-driver/node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/appium-safari-driver/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-safari-driver/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "license": "ISC", - "dependencies": { - "lodash.isfinite": "^3.3.2" - } - }, - "node_modules/appium-safari-driver/node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/appium-safari-driver/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "ftp-response-parser": "^1.0.1", - "once": "^1.4.0", - "parse-listing": "^1.1.3", - "stream-combiner": "^0.2.2", - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/jsftp/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/appium-safari-driver/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/appium-safari-driver/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "extraneous": true, - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/klaw": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", - "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", - "license": "MIT", - "engines": { - "node": ">=14.14.0" - } - }, - "node_modules/appium-safari-driver/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/appium-safari-driver/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" - } - }, - "node_modules/appium-safari-driver/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/appium-safari-driver/node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/appium-safari-driver/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "license": "MIT", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-safari-driver/node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/method-override/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-safari-driver/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-safari-driver/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC", - "optional": true - }, - "node_modules/appium-safari-driver/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/appium-safari-driver/node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-safari-driver/node_modules/morgan": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", - "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", - "license": "MIT", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.1.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-safari-driver/node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/appium-safari-driver/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/node-simctl": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-8.0.6.tgz", - "integrity": "sha512-NsoaB+I/qPwfkyCUYWD03CEQwk07UQcs9YYXp8++qQCBFazLabY1tSQXXapGx4r72BStQtS14rJr4qt3VEE5Lg==", - "license": "Apache-2.0", - "dependencies": { - "@appium/logger": "^2.0.0-rc.1", - "asyncbox": "^3.0.0", - "bluebird": "^3.5.1", - "lodash": "^4.2.1", - "rimraf": "^6.0.1", - "semver": "^7.0.0", - "source-map-support": "^0.x", - "teen_process": "^3.0.0", - "uuid": "^13.0.0", - "which": "^5.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/appium-safari-driver/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-safari-driver/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/appium-safari-driver/node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/appium-safari-driver/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/package-changed": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", - "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", - "license": "ISC", - "dependencies": { - "commander": "^6.2.0" - }, - "bin": { - "package-changed": "bin/package-changed.js" - } - }, - "node_modules/appium-safari-driver/node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/appium-safari-driver/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/parse-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "engines": { - "node": ">=0.6.21" - } - }, - "node_modules/appium-safari-driver/node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-safari-driver/node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/appium-safari-driver/node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/appium-safari-driver/node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "license": "MIT", - "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/portscanner/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/appium-safari-driver/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/appium-safari-driver/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-safari-driver/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/appium-safari-driver/node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/appium-safari-driver/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/appium-safari-driver/node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "extraneous": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/rimraf": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", - "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.0", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/rimraf/node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/rimraf/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-safari-driver/node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-safari-driver/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT", - "optional": true - }, - "node_modules/appium-safari-driver/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-safari-driver/node_modules/serve-favicon": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", - "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", - "license": "MIT", - "dependencies": { - "etag": "~1.8.1", - "fresh": "~0.5.2", - "ms": "~2.1.3", - "parseurl": "~1.3.2", - "safe-buffer": "~5.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/appium-safari-driver/node_modules/serve-favicon/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/serve-favicon/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/appium-safari-driver/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/appium-safari-driver/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/appium-safari-driver/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/appium-safari-driver/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0" - }, - "node_modules/appium-safari-driver/node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/appium-safari-driver/node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-safari-driver/node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-safari-driver/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/appium-safari-driver/node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/appium-safari-driver/node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/appium-safari-driver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/appium-safari-driver/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/appium-safari-driver/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/appium-safari-driver/node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/appium-safari-driver/node_modules/teen_process": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.3.tgz", - "integrity": "sha512-pYAojbLkaqXHpgze5AEdchW71OKownDPpqYpLTQsU/pUGMv3zr4yo2mSv/NnRAkRmsrNF2BP9byh2MVk9Y5H9A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/appium-safari-driver/node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/appium-safari-driver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/appium-safari-driver/node_modules/type-fest": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", - "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-safari-driver/node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "license": "MIT or GPL-2.0", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/appium-safari-driver/node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/appium-safari-driver/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/appium-safari-driver/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/appium-safari-driver/node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "optional": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/appium-safari-driver/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/appium-safari-driver/node_modules/winston": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", - "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.8", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/appium-safari-driver/node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", + "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { - "node": ">= 6" - } - }, - "node_modules/appium-safari-driver/node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node": ">= 10.16.0" }, - "engines": { - "node": ">= 6" + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=14" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@posthog/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.1.tgz", + "integrity": "sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" + "cross-spawn": "^7.0.6" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } + "peer": true }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "mime-db": "^1.54.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/appium-safari-driver/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "node_modules/ajv-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", + "peerDependencies": { + "ajv": "^8.0.1" + } }, - "node_modules/appium-safari-driver/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "ajv": "^8.0.0" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "ajv": { "optional": true } } }, - "node_modules/appium-safari-driver/node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/appium-safari-driver/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-safari-driver/node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/appium-safari-driver/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "license": "MIT", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/appium-safari-driver/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { + "node_modules/ansi-escapes": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "environment": "^1.0.0" }, "engines": { "node": ">=18" @@ -15514,97 +478,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-safari-driver/node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/appium-safari-driver/node_modules/yauzl/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/appium-safari-driver/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-safari-driver/node_modules/zip-stream": { + "node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/appium/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { - "node": ">= 14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "license": "MIT", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { @@ -15612,53 +508,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/asyncbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz", - "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.5.1", - "lodash": "^4.17.4", - "source-map-support": "^0.x" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -15688,213 +537,17 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/bare-fs": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.1.tgz", - "integrity": "sha512-zGUCsm3yv/ePt2PHNbVxjjn0nNB1MkIaR4wOCxJ2ig5pCf5cCVAYJXVhQg/3OhhJV6DB1ts7Hv0oUaElc2TPQg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-path": "^3.0.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", - "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/body-parser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "dev": true, "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -15919,6 +572,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -15931,37 +585,11 @@ "url": "https://opencollective.com/express" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/bplist-creator": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", - "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -15973,49 +601,11 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -16038,6 +628,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -16082,6 +673,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16097,6 +689,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -16104,48 +697,6 @@ "node": ">=8" } }, - "node_modules/cheerio": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.0.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.12.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -16174,18 +725,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", @@ -16285,15 +824,6 @@ "node": ">=8" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/code-excerpt": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", @@ -16306,19 +836,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/color": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", - "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", - "license": "MIT", - "dependencies": { - "color-convert": "^3.1.3", - "color-string": "^2.1.3" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -16330,52 +847,10 @@ "node": ">=7.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", - "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/color-string/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", - "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -16389,50 +864,11 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -16445,6 +881,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -16463,6 +900,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -16472,42 +910,12 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.6.0" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -16541,58 +949,11 @@ "node": ">= 8" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-shorthand-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.2.tgz", - "integrity": "sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==", - "license": "MIT" - }, - "node_modules/css-value": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", - "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==" - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -16606,53 +967,6 @@ } } }, - "node_modules/decamelize": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.1.tgz", - "integrity": "sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deepmerge-ts": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -16666,28 +980,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT", - "optional": true - }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -16699,151 +997,37 @@ } }, "node_modules/doc-detective-common": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.5.1.tgz", - "integrity": "sha512-EL52Vk5HXl5BNlr0GpJrxcQTZ3TOn9CNYfrT/WlBH9f+PJ80HnXfSpQpcJuw+Rn5S7OEi0empzoaNGUY4PZxXw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.6.0.tgz", + "integrity": "sha512-rHZ3WNuw3Y51KduBh9GgnrYFzJdbCQHPP3xnkp+W8QyF+4bKhWFlVVmbotFh/XL3BupbV9+CP7YEBTsW02Hvuw==", "license": "AGPL-3.0-only", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.2", + "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "yaml": "^2.8.1" + "yaml": "^2.8.2" } }, "node_modules/doc-detective-core": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/doc-detective-core/-/doc-detective-core-3.5.1.tgz", - "integrity": "sha512-kAWLRYOTM6PAvtE6ShwSe1yXONu85yUEdYDnP572F4X6mkyDzWWa9maCFmEv7BDDZdsksWTzCgWQnddwMtT2mA==", - "hasInstallScript": true, - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.2", - "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@puppeteer/browsers": "^2.10.13", - "ajv": "^8.17.1", - "appium": "^3.1.1", - "appium-chromium-driver": "^2.0.3", - "appium-geckodriver": "^2.1.1", - "appium-safari-driver": "^4.1.0", - "axios": "^1.13.2", - "doc-detective-common": "^3.5.1", - "doc-detective-resolver": "^3.5.2", - "dotenv": "^17.2.3", - "geckodriver": "^6.1.0", - "jq-web": "^0.6.2", - "json-schema-faker": "^0.5.9", - "pixelmatch": "^5.3.0", - "pngjs": "^7.0.0", - "posthog-node": "^5.14.0", - "tree-kill": "^1.2.2", - "webdriverio": "^9.20.1" - }, - "optionalDependencies": { - "@ffmpeg-installer/darwin-arm64": "4.1.5", - "@ffmpeg-installer/darwin-x64": "4.1.0", - "@ffmpeg-installer/linux-arm": "4.1.3", - "@ffmpeg-installer/linux-arm64": "4.1.4", - "@ffmpeg-installer/linux-ia32": "4.1.0", - "@ffmpeg-installer/linux-x64": "4.1.0", - "@ffmpeg-installer/win32-ia32": "4.1.0", - "@ffmpeg-installer/win32-x64": "4.1.0", - "@img/sharp-darwin-arm64": "^0.34.5", - "@img/sharp-darwin-x64": "^0.34.5", - "@img/sharp-libvips-darwin-arm64": "^1.2.4", - "@img/sharp-libvips-darwin-x64": "^1.2.4", - "@img/sharp-libvips-linux-arm": "^1.2.4", - "@img/sharp-libvips-linux-arm64": "^1.2.4", - "@img/sharp-libvips-linux-ppc64": "^1.2.4", - "@img/sharp-libvips-linux-riscv64": "^1.2.4", - "@img/sharp-libvips-linux-s390x": "^1.2.4", - "@img/sharp-libvips-linux-x64": "^1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "^1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "^1.2.4", - "@img/sharp-linux-arm": "^0.34.5", - "@img/sharp-linux-arm64": "^0.34.5", - "@img/sharp-linux-ppc64": "^0.34.5", - "@img/sharp-linux-riscv64": "^0.34.5", - "@img/sharp-linux-s390x": "^0.34.5", - "@img/sharp-linux-x64": "^0.34.5", - "@img/sharp-linuxmusl-arm64": "^0.34.5", - "@img/sharp-linuxmusl-x64": "^0.34.5", - "@img/sharp-wasm32": "^0.34.5", - "@img/sharp-win32-arm64": "^0.34.5", - "@img/sharp-win32-ia32": "^0.34.5", - "@img/sharp-win32-x64": "^0.34.5" - } + "resolved": "../core", + "link": true }, "node_modules/doc-detective-resolver": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.5.2.tgz", - "integrity": "sha512-7lSoAsgSDuMRjd8QpEiOlcsEU3/xY4bXfd9HDKAGek0Rsjwf7wcBSW2h/kGAWbhkfj1GPzHVlig4tZsoc9L5DQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.6.1.tgz", + "integrity": "sha512-8loBGZctT4JWo5PgjYk9b4ZRyJy/Od33KKd5Q+Sa/XEiaQ0e6602e9oI/JDfmnaB1KGUi9qTigezRLIMQlH+Dw==", "license": "AGPL-3.0-only", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.2", + "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "axios": "^1.13.2", - "doc-detective-common": "^3.5.1", + "doc-detective-common": "^3.6.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.14.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "posthog-node": "^5.17.0" } }, "node_modules/dotenv": { @@ -16872,150 +1056,33 @@ "node": ">= 0.4" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/edge-paths": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", - "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", - "license": "MIT", - "dependencies": { - "@types/which": "^2.0.1", - "which": "^2.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/shirshak55" - } - }, - "node_modules/edge-paths/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/edge-paths/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/edgedriver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-6.2.0.tgz", - "integrity": "sha512-49G6010o0VYXUMNi5OvxqE9O/kazs0qmJVqHcSHNvp1VfojO21Kb/NaJN40uy11yrlGHRp7y6a372xoCnShzlA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@wdio/logger": "^9.18.0", - "@zip.js/zip.js": "^2.8.11", - "decamelize": "^6.0.1", - "edge-paths": "^3.0.5", - "fast-xml-parser": "^5.3.2", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "which": "^6.0.0" - }, - "bin": { - "edgedriver": "bin/edgedriver.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/edgedriver/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, "license": "MIT" }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node": ">= 0.8" } }, "node_modules/environment": { @@ -17030,15 +1097,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -17106,6 +1164,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { @@ -17117,27 +1176,6 @@ "node": ">=8" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -17151,64 +1189,21 @@ "node": ">=4" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, "node_modules/express": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -17251,6 +1246,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -17260,6 +1256,7 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -17269,6 +1266,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -17277,71 +1275,11 @@ "node": ">= 0.6" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extract-zip/node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, "node_modules/fast-uri": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", @@ -17358,71 +1296,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/fast-xml-parser": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.2.tgz", - "integrity": "sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", @@ -17454,6 +1327,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -17471,6 +1345,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -17491,12 +1366,6 @@ "flat": "cli.js" } }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -17521,6 +1390,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", @@ -17555,65 +1425,16 @@ "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", "license": "MIT" }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ftp-response-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", - "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "dependencies": { - "readable-stream": "^1.0.31" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ftp-response-parser/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ftp-response-parser/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -17623,27 +1444,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/geckodriver": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-6.1.0.tgz", - "integrity": "sha512-ZRXLa4ZaYTTgUO4Eefw+RsQCleugU2QLb1ME7qTYxxuRj51yAhfnXaItXNs5/vUzfIaDHuZ+YnSF005hfp07nQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@wdio/logger": "^9.18.0", - "@zip.js/zip.js": "^2.8.11", - "decamelize": "^6.0.1", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "modern-tar": "^0.7.2" - }, - "bin": { - "geckodriver": "bin/geckodriver.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -17688,18 +1488,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -17713,36 +1501,11 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -17771,29 +1534,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "license": "MIT" - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT", - "optional": true - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -17833,126 +1578,24 @@ "dependencies": { "function-bind": "^1.1.2" }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "optional": true - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "optional": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/htmlfy": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.8.1.tgz", - "integrity": "sha512-xWROBw9+MEGwxpotll0h672KCaLrKKiCYzsyN8ZgL9cQbVumFnyvsk2JqiB9ELAV1GLj1GG/jxZUjV9OZZi/yQ==", - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "engines": { + "node": ">= 0.4" } }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT", - "optional": true + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -17969,86 +1612,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", @@ -18065,6 +1628,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, "license": "ISC" }, "node_modules/ink": { @@ -18072,7 +1636,6 @@ "resolved": "https://registry.npmjs.org/ink/-/ink-6.5.1.tgz", "integrity": "sha512-wF3j/DmkM8q5E+OtfdQhCRw8/0ahkc8CUTgEddxZzpEWPslu7YPL3t64MWRoI9m6upVGpfAg4ms2BBvxCdKRLQ==", "license": "MIT", - "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.1", "ansi-escapes": "^7.2.0", @@ -18277,45 +1840,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -18339,15 +1873,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -18358,40 +1883,18 @@ "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, "license": "MIT" }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, "engines": { "node": ">=10" }, @@ -18399,25 +1902,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -18428,18 +1917,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jq-web": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/jq-web/-/jq-web-0.6.2.tgz", - "integrity": "sha512-+7XvjBYwTx4vP5PYkf6Q6orubO/v+UgMU6By1GritrmShr9QpT3UKa4ANzXWQfhdqtBnQYXsm7ZNbdIHT6tYpQ==", - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -18457,49 +1934,10 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 10.16.0" } }, - "node_modules/jsftp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", - "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "ftp-response-parser": "^1.0.1", - "once": "^1.4.0", - "parse-listing": "^1.1.3", - "stream-combiner": "^0.2.2", - "unorm": "^1.4.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsftp/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-faker": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", @@ -18570,190 +2008,11 @@ "node": ">=18.0.0" } }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/klaw": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", - "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", - "license": "MIT", - "engines": { - "node": ">=14.14.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/locate-app": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", - "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@promptbook/utils": "0.69.5", - "type-fest": "4.26.0", - "userhome": "1.0.1" - } - }, - "node_modules/locate-app/node_modules/type-fest": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", - "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -18764,43 +2023,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "license": "ISC", - "dependencies": { - "signal-exit": "^3.0.2" - } - }, - "node_modules/lockfile/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "license": "MIT" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -18812,46 +2039,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/loglevel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loglevel-plugin-prefix": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", - "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", - "license": "MIT" - }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -18866,6 +2058,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -18875,6 +2068,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -18883,45 +2077,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/method-override": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", - "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "license": "MIT", - "dependencies": { - "debug": "3.1.0", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/method-override/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/method-override/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -18952,17 +2107,11 @@ "node": ">=6" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC", - "optional": true - }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -18977,16 +2126,11 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, "node_modules/mocha": { "version": "11.7.5", "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", @@ -19036,477 +2180,124 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-tar": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.2.tgz", - "integrity": "sha512-TGG1ZRk1TAQ3neuZwahAHke3rKsSlro+ooMYtjh9sl2gGPVMLMuWiHgwC7im9T5bSM566RSo2Dko56ETgEvZcA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/morgan": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", - "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", - "license": "MIT", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.1.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } - }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-fetch/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT", - "optional": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "license": "MIT", - "dependencies": { - "format-util": "^1.0.3" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "license": "MIT", "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 14" + "node": ">= 0.8" } }, - "node_modules/package-changed": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", - "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { - "commander": "^6.2.0" - }, - "bin": { - "package-changed": "bin/package-changed.js" + "wrappy": "1" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-listing": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", - "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "engines": { - "node": ">=0.6.21" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "node_modules/ono": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", + "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", "license": "MIT", "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "format-util": "^1.0.3" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "license": "MIT", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "license": "MIT", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { - "parse5": "^7.0.0" + "p-limit": "^3.0.2" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=10" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -19525,6 +2316,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -19537,16 +2329,11 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -19562,126 +2349,37 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, - "node_modules/pixelmatch": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", - "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", - "dependencies": { - "pngjs": "^6.0.0" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/pixelmatch/node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "engines": { - "node": ">=14.19.0" - } - }, "node_modules/posthog-node": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.14.0.tgz", - "integrity": "sha512-cKY2Wdtjx5wlIWL9/Im5/FT+zeKaYjtG94rfrIFKTVoCdwV7S9PaU8frLD/8TpGx1SwOFgw7QTjhpa/vnxTlww==", + "version": "5.17.2", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", + "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", "license": "MIT", "dependencies": { - "@posthog/core": "1.6.0" + "@posthog/core": "1.7.1" }, "engines": { "node": ">=20" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -19691,54 +2389,17 @@ "node": ">= 0.10" } }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -19750,12 +2411,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/query-selector-shadow-dom": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", - "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", - "license": "MIT" - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -19769,6 +2424,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -19778,6 +2434,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -19793,6 +2450,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -19810,7 +2468,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -19830,204 +2487,42 @@ "react": "^19.2.0" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readable-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", - "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^2.0.1" - } - }, - "node_modules/resq/node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", - "license": "MIT" - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, "engines": { - "node": ">=8" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/ret": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", - "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/rgb2hex": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", - "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", - "license": "MIT" + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -20040,19 +2535,11 @@ "node": ">= 18" } }, - "node_modules/safaridriver": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-1.0.0.tgz", - "integrity": "sha512-J92IFbskyo7OYB3Dt4aTdyhag1GlInrfbPCmMteb7aBK7PwlnGz1HI0+oyNN97j7pV9DqUAVoVgkNRMrfY47mQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -20068,78 +2555,24 @@ } ] }, - "node_modules/safe-regex2": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", - "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT", - "dependencies": { - "ret": "~0.5.0" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, "license": "MIT" }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT", - "optional": true - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -20162,6 +2595,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -20171,6 +2605,7 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -20180,6 +2615,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -20188,33 +2624,6 @@ "node": ">= 0.6" } }, - "node_modules/serialize-error": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-12.0.0.tgz", - "integrity": "sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==", - "license": "MIT", - "dependencies": { - "type-fest": "^4.31.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -20224,26 +2633,11 @@ "randombytes": "^2.1.0" } }, - "node_modules/serve-favicon": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", - "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", - "license": "MIT", - "dependencies": { - "etag": "~1.8.1", - "fresh": "~0.5.2", - "ms": "~2.1.3", - "parseurl": "~1.3.2", - "safe-buffer": "~5.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -20255,69 +2649,13 @@ "node": ">= 18" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, "license": "ISC" }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -20337,22 +2675,11 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -20372,6 +2699,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -20388,6 +2716,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -20406,6 +2735,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -20425,6 +2755,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "engines": { "node": ">=14" }, @@ -20475,182 +2806,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spacetrim": { - "version": "0.11.59", - "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz", - "integrity": "sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==", - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" - } - ], - "license": "Apache-2.0" - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -20667,54 +2828,17 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", - "license": "MIT", - "dependencies": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -20732,6 +2856,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -20745,6 +2870,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -20752,12 +2878,14 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -20784,6 +2912,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -20795,6 +2924,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -20805,28 +2935,17 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -20837,92 +2956,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", - "license": "Apache-2.0", - "dependencies": { - "bluebird": "^3.7.2", - "lodash": "^4.17.21", - "shell-quote": "^1.8.1", - "source-map-support": "^0.x" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": ">=10" - } - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" - }, "node_modules/to-rotated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-rotated/-/to-rotated-1.0.0.tgz", @@ -20939,62 +2972,17 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.6" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", - "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -21009,6 +2997,7 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -21018,6 +3007,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -21030,293 +3020,26 @@ "url": "https://opencollective.com/express" } }, - "node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "license": "MIT or GPL-2.0", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/urlpattern-polyfill": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", - "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", - "license": "MIT" - }, - "node_modules/userhome": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz", - "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==", - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/wait-port": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", - "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "commander": "^9.3.0", - "debug": "^4.3.4" - }, - "bin": { - "wait-port": "bin/wait-port.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/wait-port/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "optional": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/webdriver": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.20.1.tgz", - "integrity": "sha512-QtvYqPai2NOnq7qePPH6kNSwk7+tnmSvnlOnY8dIT/Y24TPdQp44NjF/BUYAWIlqoBlZqHClQFTSVwT2qvO2Tw==", - "license": "MIT", - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "9.20.1", - "@wdio/logger": "9.18.0", - "@wdio/protocols": "9.16.2", - "@wdio/types": "9.20.0", - "@wdio/utils": "9.20.1", - "deepmerge-ts": "^7.0.3", - "https-proxy-agent": "^7.0.6", - "undici": "^6.21.3", - "ws": "^8.8.0" - }, - "engines": { - "node": ">=18.20.0" - } - }, - "node_modules/webdriver/node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/webdriver/node_modules/undici": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", - "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/webdriver/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/webdriverio": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.20.1.tgz", - "integrity": "sha512-QVM/asb5sDESz37ow/BAOA0z2HtUJsuAjPKHdw+Vx92PaQP3EfHwTgxK2T5rgwa0WRNh+c+n/0nEqIvqBl01sA==", - "license": "MIT", - "dependencies": { - "@types/node": "^20.11.30", - "@types/sinonjs__fake-timers": "^8.1.5", - "@wdio/config": "9.20.1", - "@wdio/logger": "9.18.0", - "@wdio/protocols": "9.16.2", - "@wdio/repl": "9.16.2", - "@wdio/types": "9.20.0", - "@wdio/utils": "9.20.1", - "archiver": "^7.0.1", - "aria-query": "^5.3.0", - "cheerio": "^1.0.0-rc.12", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "grapheme-splitter": "^1.0.4", - "htmlfy": "^0.8.1", - "is-plain-obj": "^4.1.0", - "jszip": "^3.10.1", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "query-selector-shadow-dom": "^1.0.1", - "resq": "^1.11.0", - "rgb2hex": "0.2.5", - "serialize-error": "^12.0.0", - "urlpattern-polyfill": "^10.0.0", - "webdriver": "9.20.1" - }, - "engines": { - "node": ">=18.20.0" - }, - "peerDependencies": { - "puppeteer-core": ">=22.x || <=24.x" - }, - "peerDependenciesMeta": { - "puppeteer-core": { - "optional": true - } - } - }, - "node_modules/webdriverio/node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/webdriverio/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/widest-line": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", @@ -21355,70 +3078,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/winston": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", - "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.8", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/workerpool": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", @@ -21447,6 +3106,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -21463,6 +3123,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -21470,12 +3131,14 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21489,6 +3152,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -21537,6 +3201,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/ws": { @@ -21560,15 +3225,6 @@ } } }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -21578,15 +3234,18 @@ } }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -21692,32 +3351,11 @@ "node": ">=8" } }, - "node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, @@ -21730,20 +3368,6 @@ "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", "license": "MIT" - }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } } } } diff --git a/cli/package.json b/cli/package.json index 744ae89..fd223b3 100644 --- a/cli/package.json +++ b/cli/package.json @@ -35,13 +35,14 @@ "@ffmpeg-installer/ffmpeg": "^1.1.0", "axios": "^1.13.2", "doc-detective-common": "^3.5.1", - "doc-detective-core": "^3.5.1", + "doc-detective-core": "file:../core", "doc-detective-resolver": "^3.6.1", "ink": "^6.5.1", "ink-select-input": "^6.2.0", "ink-spinner": "^5.0.0", "js-yaml": "^4.1.1", "react": "^19.2.0", + "yaml": "^2.8.2", "yargs": "^17.7.2" }, "devDependencies": { From 7ce6c5085cf06b4ddc65c6d8a645dd25080bfde5 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 5 Dec 2025 11:45:31 -0800 Subject: [PATCH 12/90] Fix JSON/YAML paths --- cli/src/index.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/cli/src/index.js b/cli/src/index.js index c4e8018..aa3e381 100755 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -81,8 +81,31 @@ async function main(argv) { if (detectedSpecs && detectedSpecs.length > 0) { // Convert detected specs to the format expected by the builder - for (const detectedSpec of detectedSpecs) { - const filePath = detectedSpec.contentPath || null; + // For JSON/YAML files, the resolver doesn't set contentPath, so we need to + // map specs back to their source files using the input paths. + + // If there's a 1:1 mapping between input JSON/YAML files and detected specs, + // we can associate them directly + const jsonYamlInputs = inputPaths.filter(p => { + const ext = path.extname(p).toLowerCase(); + return ext === '.json' || ext === '.yaml' || ext === '.yml'; + }); + + for (let i = 0; i < detectedSpecs.length; i++) { + const detectedSpec = detectedSpecs[i]; + + // Use contentPath if available (e.g., for markdown files) + // Otherwise, try to match with JSON/YAML input files + let filePath = detectedSpec.contentPath || null; + + if (!filePath && jsonYamlInputs.length === detectedSpecs.length) { + // 1:1 mapping - use the corresponding input file + filePath = jsonYamlInputs[i]; + } else if (!filePath && jsonYamlInputs.length === 1 && detectedSpecs.length === 1) { + // Single input file, single spec - use the input file + filePath = jsonYamlInputs[0]; + } + const ext = filePath ? path.extname(filePath).toLowerCase() : '.json'; // detectedSpec is already a valid spec_v3 object from detectTests From 26869fa93b3cc1af5f3a78a7467e6335a82f6ae5 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 5 Dec 2025 13:59:22 -0800 Subject: [PATCH 13/90] Tests --- cli/package.json | 6 +- cli/test/builder/DebugRunner.test.mjs | 401 +++++++++++ cli/test/builder/StepEditor.test.mjs | 354 ++++++++++ cli/test/builder/TestBuilder.test.mjs | 352 ++++++++++ cli/test/builder/editor.test.mjs | 281 ++++++++ cli/test/builder/fixtures.mjs | 270 +++++++ cli/test/builder/schemaUtils.test.mjs | 575 +++++++++++++++ cli/test/builder/sourceFileUtils.test.mjs | 816 ++++++++++++++++++++++ 8 files changed, 3053 insertions(+), 2 deletions(-) create mode 100644 cli/test/builder/DebugRunner.test.mjs create mode 100644 cli/test/builder/StepEditor.test.mjs create mode 100644 cli/test/builder/TestBuilder.test.mjs create mode 100644 cli/test/builder/editor.test.mjs create mode 100644 cli/test/builder/fixtures.mjs create mode 100644 cli/test/builder/schemaUtils.test.mjs create mode 100644 cli/test/builder/sourceFileUtils.test.mjs diff --git a/cli/package.json b/cli/package.json index fd223b3..ccf9b35 100644 --- a/cli/package.json +++ b/cli/package.json @@ -8,7 +8,7 @@ "main": "./src/index.js", "scripts": { "mocha": "mocha", - "test": "mocha test/*.test.js", + "test": "mocha test/*.test.js test/builder/*.test.mjs", "prerunTests": "node ./src/checkDependencies.js", "runTests": "node ./src/index.js runTests", "start": "node ./src/index.js", @@ -49,6 +49,8 @@ "body-parser": "^2.2.1", "chai": "^6.2.1", "express": "^5.1.0", - "mocha": "^11.7.5" + "ink-testing-library": "^4.0.0", + "mocha": "^11.7.5", + "sinon": "^19.0.2" } } diff --git a/cli/test/builder/DebugRunner.test.mjs b/cli/test/builder/DebugRunner.test.mjs new file mode 100644 index 0000000..401c188 --- /dev/null +++ b/cli/test/builder/DebugRunner.test.mjs @@ -0,0 +1,401 @@ +/** + * Tests for DebugRunner.mjs - Interactive step-by-step test execution component + * + * Uses ink-testing-library for component rendering and Sinon for stubbing getRunner. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; +import * as sinon from 'sinon'; + +const require = createRequire(import.meta.url); + +import DebugRunner from '../../src/cli/builder/DebugRunner.mjs'; +import { + getMockTest, + getMockGoToStep, + getMockClickStep, + getMockFindStep, + getMockStepResult, + getMockFailedStepResult, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('DebugRunner component', function () { + // Store original require for stubbing + let coreModule; + let sandbox; + + before(function () { + // Get reference to doc-detective-core module + coreModule = require('doc-detective-core'); + }); + + beforeEach(function () { + sandbox = sinon.createSandbox(); + }); + + afterEach(function () { + sandbox.restore(); + }); + + describe('initialization phase', function () { + it('shows loading message during initialization', function () { + // Stub getRunner to delay initialization + sandbox.stub(coreModule, 'getRunner').returns(new Promise(() => {})); // Never resolves + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Starting browser'); + }); + }); + + describe('goTo requirement check', function () { + it('shows warning when first browser action has no goTo', async function () { + // Create a mock runner that resolves quickly + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockClickStep('.button')], // Click without goTo first + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for async initialization + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('Navigation'); + }); + + it('proceeds to step preview when goTo exists', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.button'), + ], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + // Wait for async initialization + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('Step 1'); + }); + }); + + describe('step preview phase', function () { + it('displays current step information', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + expect(frame).to.include('example.com'); + }); + + it('shows Run this step option', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('Run this step'); + }); + + it('shows Edit step option', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('Edit step'); + }); + + it('shows Stop debug session option', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('Stop debug'); + }); + + it('displays step count correctly', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.button'), + getMockFindStep('.result'), + ], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('1/3'); + }); + }); + + describe('error handling', function () { + it('shows error phase when runner initialization fails', async function () { + sandbox.stub(coreModule, 'getRunner').rejects(new Error('Browser not installed')); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('Error'); + expect(frame).to.include('Browser'); + }); + }); + + describe('progress tracking', function () { + it('displays passed/failed counts', async function () { + const mockRunner = { browser: {} }; + const mockRunStep = sandbox.stub().resolves(getMockStepResult()); + const mockCleanup = sandbox.stub().resolves(); + + sandbox.stub(coreModule, 'getRunner').resolves({ + runner: mockRunner, + runStep: mockRunStep, + cleanup: mockCleanup, + }); + + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + + const { lastFrame } = render( + React.createElement(DebugRunner, { + test, + testIndex: 0, + onComplete: () => {}, + onCancel: () => {}, + }) + ); + + await new Promise(resolve => setTimeout(resolve, 50)); + + const frame = lastFrame(); + expect(frame).to.include('passed'); + expect(frame).to.include('failed'); + }); + }); +}); + +describe('DebugRunner smoke test', function () { + this.timeout(60000); // Browser tests can be slow + + // Skip by default - enable for integration testing + // Remove .skip to run actual browser test + describe.skip('real browser execution', function () { + let server; + + before(async function () { + // Use existing test server if available + const { createServer } = await import('../server/index.js'); + server = createServer({ port: 8093 }); + await server.start(); + }); + + after(async function () { + if (server) { + await server.stop(); + } + }); + + it('executes goTo step successfully with real browser', async function () { + const { getRunner } = require('doc-detective-core'); + + const { runner, runStep, cleanup } = await getRunner({ headless: true }); + + try { + const step = getMockGoToStep('http://localhost:8093'); + + const result = await runStep({ + config: {}, + context: {}, + step, + driver: runner, + metaValues: {}, + options: {}, + }); + + expect(result.status).to.equal('PASS'); + } finally { + await cleanup(); + } + }); + }); +}); diff --git a/cli/test/builder/StepEditor.test.mjs b/cli/test/builder/StepEditor.test.mjs new file mode 100644 index 0000000..408c17f --- /dev/null +++ b/cli/test/builder/StepEditor.test.mjs @@ -0,0 +1,354 @@ +/** + * Tests for StepEditor.mjs - Step editor component + * + * Uses ink-testing-library to render and test the Ink React component. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; + +const require = createRequire(import.meta.url); + +import StepEditor from '../../src/cli/builder/StepEditor.mjs'; +import { + getMockStep, + getMockGoToStep, + getMockClickStep, + getMockFindStep, + getMockTypeStep, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('StepEditor component', function () { + // Common callback stubs + const noopCallbacks = { + onChange: () => {}, + onSave: () => {}, + onCancel: () => {}, + onDelete: () => {}, + }; + + describe('step type selection', function () { + it('shows step type selector when step has no action', function () { + const emptyStep = {}; + const { lastFrame } = render( + React.createElement(StepEditor, { + step: emptyStep, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Select Step Type'); + }); + + it('lists available step types', function () { + const emptyStep = {}; + const { lastFrame } = render( + React.createElement(StepEditor, { + step: emptyStep, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + expect(frame).to.include('click'); + expect(frame).to.include('find'); + }); + }); + + describe('menu display for existing step', function () { + it('shows Edit Step header with step type', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Edit Step'); + expect(frame).to.include('goTo'); + }); + + it('displays current step value', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('https://example.com'); + }); + + it('shows Add field option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add field'); + }); + + it('shows Preview JSON option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Preview JSON'); + }); + + it('shows Change step type option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Change step type'); + }); + + it('shows Save step option for valid step', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Save step'); + }); + + it('shows Delete step option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Delete step'); + }); + + it('shows Back option', function () { + const step = getMockGoToStep('https://example.com'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Back'); + }); + }); + + describe('step index display', function () { + it('displays correct step number', function () { + const step = getMockGoToStep(); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 2, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Step 3'); // 0-indexed to 1-indexed + }); + }); + + describe('different step types', function () { + it('displays click step correctly', function () { + const step = getMockClickStep('.submit-button'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('click'); + expect(frame).to.include('.submit-button'); + }); + + it('displays find step correctly', function () { + const step = getMockFindStep('#main-content'); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('find'); + expect(frame).to.include('#main-content'); + }); + + it('displays type step with array value', function () { + const step = getMockTypeStep(['test input', '$ENTER$']); + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('type'); + }); + }); + + describe('object form steps', function () { + it('displays object properties for detailed step', function () { + const step = { + goTo: { + url: 'https://example.com', + wait: { duration: 5000 }, + }, + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + }); + + describe('step with common properties', function () { + it('displays step with description', function () { + const step = { + goTo: 'https://example.com', + description: 'Navigate to homepage', + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('description'); + expect(frame).to.include('Navigate'); + }); + + it('displays step with stepId', function () { + const step = { + goTo: 'https://example.com', + stepId: 'nav-step', + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('stepId'); + expect(frame).to.include('nav-step'); + }); + }); + + describe('validation display', function () { + it('shows warning for step with validation errors', function () { + // A step with an unrecognized action type would fail validation + // but we need a step type to display the menu, so we create an invalid value instead + const step = { + goTo: { url: '' }, // Empty required field might fail validation + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + // The step might show validation warning or "Fix errors" message + // depending on schema validation + expect(frame).to.include('goTo'); + }); + }); + + describe('source location preservation', function () { + it('handles step with sourceLocation metadata', function () { + const step = { + goTo: 'https://example.com', + sourceLocation: { + file: '/path/to/file.md', + isInline: true, + startOffset: 0, + endOffset: 50, + }, + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + // sourceLocation should not appear in the menu as it's internal metadata + expect(frame).to.include('goTo'); + expect(frame).to.not.include('sourceLocation'); + }); + }); +}); diff --git a/cli/test/builder/TestBuilder.test.mjs b/cli/test/builder/TestBuilder.test.mjs new file mode 100644 index 0000000..bd2b69e --- /dev/null +++ b/cli/test/builder/TestBuilder.test.mjs @@ -0,0 +1,352 @@ +/** + * Tests for TestBuilder.mjs - Main test builder orchestrator component + * + * Uses ink-testing-library to render and test the Ink React component. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; +import * as fs from 'fs'; +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +import TestBuilder from '../../src/cli/builder/TestBuilder.mjs'; +import { + getMockSpec, + getMockTest, + getMockGoToStep, + getMockCompleteSpec, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('TestBuilder component', function () { + // Temp file handling for save tests + const tempDir = path.join(__dirname, 'temp'); + + before(function () { + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + }); + + afterEach(function () { + // Clean up temp files after each test + if (fs.existsSync(tempDir)) { + const files = fs.readdirSync(tempDir); + for (const file of files) { + fs.unlinkSync(path.join(tempDir, file)); + } + } + }); + + after(function () { + // Remove temp directory + if (fs.existsSync(tempDir)) { + fs.rmdirSync(tempDir); + } + }); + + describe('initial rendering', function () { + it('shows spec name input when no initial spec provided', function () { + const { lastFrame } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Doc Detective Test Builder'); + expect(frame).to.include('Spec name'); + }); + + it('shows menu when initial spec is provided', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 2 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test Builder'); + }); + + it('displays spec properties section', function () { + const spec = getMockSpec({ specId: 'my-spec', description: 'My description' }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Spec Properties'); + }); + + it('displays tests section', function () { + const spec = getMockCompleteSpec({ testCount: 2, stepsPerTest: 1 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Tests'); + expect(frame).to.include('(2)'); + }); + }); + + describe('validation display', function () { + it('shows validation warning for invalid spec', function () { + const invalidSpec = { tests: 'not an array' }; + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: invalidSpec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + isValid: false, + validationErrors: 'tests must be an array', + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Validation Warning'); + }); + + it('shows save disabled message when no tests', function () { + const spec = getMockSpec(); // Empty tests array + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add at least one test'); + }); + }); + + describe('menu items', function () { + it('shows Add property option', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add property'); + }); + + it('shows Add test option', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add test'); + }); + + it('shows Preview option', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Preview'); + }); + + it('shows Exit option', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Exit'); + }); + + it('shows Debug option when tests have steps', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 2 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('debug'); + }); + + it('shows Save option when spec is valid with tests', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 1 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Save'); + }); + }); + + describe('output path display', function () { + it('displays JSON output path for JSON input', function () { + const spec = getMockSpec(); + const inputPath = path.join(tempDir, 'test.spec.json'); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: inputPath, + inputFileExtension: '.json', + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.json'); + expect(frame).to.include('JSON'); + }); + + it('displays YAML output path for YAML input', function () { + const spec = getMockSpec(); + const inputPath = path.join(tempDir, 'test.spec.yaml'); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: inputPath, + inputFileExtension: '.yaml', + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.yaml'); + expect(frame).to.include('YAML'); + }); + }); + + describe('back button behavior', function () { + it('shows back option when onBack callback provided', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + onBack: () => {}, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Back to spec list'); + }); + + it('does not show back option when onBack not provided', function () { + const spec = getMockSpec(); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.not.include('Back to spec list'); + }); + }); + + describe('status bar', function () { + it('displays spec name in status bar', function () { + const spec = getMockSpec({ specId: 'my-test-spec' }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'my-test-spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('my-test-spec'); + }); + }); + + describe('test list display', function () { + it('displays test descriptions in menu', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ testId: 'test-1', description: 'First test description', steps: [] }), + getMockTest({ testId: 'test-2', description: 'Second test description', steps: [] }), + ], + }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('First test'); + expect(frame).to.include('Second test'); + }); + + it('displays step count for each test', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 3 }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('3 steps'); + }); + }); +}); diff --git a/cli/test/builder/editor.test.mjs b/cli/test/builder/editor.test.mjs new file mode 100644 index 0000000..83739a8 --- /dev/null +++ b/cli/test/builder/editor.test.mjs @@ -0,0 +1,281 @@ +/** + * CLI Editor Integration Tests + * + * Tests the --editor flag CLI entry point and argument parsing. + * Uses spawnCommand() pattern from existing CLI tests. + */ + +import { createRequire } from 'module'; +import path from 'path'; +import fs from 'fs'; +import os from 'os'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const { expect } = await import('chai'); + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Path to CLI entry point +const CLI_PATH = path.resolve(__dirname, '../../src/index.js'); + +// Helper to create temp directory with cleanup +const createTempDir = () => { + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'dd-editor-test-')); + return tempDir; +}; + +// Helper to create a test spec file +const createTestSpecFile = (dir, filename, content) => { + const filePath = path.join(dir, filename); + fs.writeFileSync(filePath, JSON.stringify(content, null, 2)); + return filePath; +}; + +// Helper to spawn CLI with timeout (for interactive commands) +const spawnWithTimeout = async (args, options = {}) => { + const { spawn } = await import('child_process'); + const timeout = options.timeout || 3000; + + return new Promise((resolve) => { + const child = spawn('node', [CLI_PATH, ...args], { + env: { ...process.env, ...options.env }, + cwd: options.cwd || process.cwd(), + stdio: ['pipe', 'pipe', 'pipe'], + }); + + let stdout = ''; + let stderr = ''; + + child.stdout.on('data', (data) => { + stdout += data.toString(); + }); + + child.stderr.on('data', (data) => { + stderr += data.toString(); + }); + + // For interactive commands, we can't wait for natural exit + // Send interrupt after timeout to capture initial output + const timer = setTimeout(() => { + child.kill('SIGTERM'); + }, timeout); + + child.on('close', (exitCode) => { + clearTimeout(timer); + resolve({ stdout, stderr, exitCode }); + }); + + child.on('error', (err) => { + clearTimeout(timer); + resolve({ stdout, stderr, exitCode: 1, error: err.message }); + }); + }); +}; + +describe('CLI Editor Integration', function() { + // These tests may take time due to CLI startup + this.timeout(30000); + + let tempDir; + + beforeEach(() => { + tempDir = createTempDir(); + }); + + afterEach(() => { + // Clean up temp directory + if (tempDir && fs.existsSync(tempDir)) { + fs.rmSync(tempDir, { recursive: true, force: true }); + } + }); + + describe('--editor flag recognition', () => { + it('should recognize --editor flag', async () => { + // Create a valid spec file + const specContent = { + id: 'test-spec', + tests: [{ + id: 'test-1', + steps: [{ action: 'wait', duration: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'test.spec.json', specContent); + + // Run with --editor flag - it will start interactive mode + // We just want to verify it starts without immediate errors + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + // Interactive mode should not produce errors on startup + // It may exit with SIGTERM since we kill it + expect(result.stderr).to.not.include('Error:'); + expect(result.stderr).to.not.include('SyntaxError'); + }); + + it('should recognize -e short flag', async () => { + const specContent = { + id: 'test-spec', + tests: [{ + id: 'test-1', + steps: [{ action: 'wait', duration: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'test.spec.json', specContent); + + const result = await spawnWithTimeout(['-e', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('Error:'); + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('input file handling', () => { + it('should accept --input flag with spec file', async () => { + const specContent = { + id: 'input-test-spec', + tests: [{ + id: 'test-1', + steps: [{ action: 'wait', duration: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'input-test.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '--input', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + // Should not have startup errors + expect(result.stderr).to.not.include('SyntaxError'); + }); + + it('should accept -i short flag with spec file', async () => { + const specContent = { + id: 'short-flag-test', + tests: [{ + id: 'test-1', + steps: [{ action: 'wait', duration: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'short-flag.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + + it('should accept --input=value format', async () => { + const specContent = { + id: 'equals-format-test', + tests: [{ + id: 'test-1', + steps: [{ action: 'wait', duration: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'equals-format.spec.json', specContent); + + const result = await spawnWithTimeout([`--editor`, `--input=${specPath}`], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + + it('should error when no valid specs found', async () => { + // Create an empty file that won't be detected as a valid spec + const emptyPath = path.join(tempDir, 'empty.txt'); + fs.writeFileSync(emptyPath, ''); + + const result = await spawnWithTimeout(['--editor', '-i', emptyPath], { + timeout: 3000, + cwd: tempDir, + }); + + // Should have an error message about no valid specs + expect(result.stderr).to.include('No valid spec files'); + }); + + it('should accept comma-separated input paths', async () => { + const spec1Content = { + id: 'multi-input-1', + tests: [{ + id: 'test-1', + steps: [{ action: 'wait', duration: 100 }] + }] + }; + const spec2Content = { + id: 'multi-input-2', + tests: [{ + id: 'test-2', + steps: [{ action: 'wait', duration: 100 }] + }] + }; + const specPath1 = createTestSpecFile(tempDir, 'multi1.spec.json', spec1Content); + const specPath2 = createTestSpecFile(tempDir, 'multi2.spec.json', spec2Content); + + const result = await spawnWithTimeout( + ['--editor', '-i', `${specPath1},${specPath2}`], + { + timeout: 2000, + cwd: tempDir, + } + ); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('YAML spec file support', () => { + it('should accept YAML spec files', async () => { + // Create a YAML spec file + const yamlContent = `id: yaml-test-spec +tests: + - id: yaml-test-1 + steps: + - action: wait + duration: 100 +`; + const yamlPath = path.join(tempDir, 'test.spec.yaml'); + fs.writeFileSync(yamlPath, yamlContent); + + const result = await spawnWithTimeout(['--editor', '-i', yamlPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('positional arguments', () => { + it('should accept spec file path as positional argument', async () => { + const specContent = { + id: 'positional-test', + tests: [{ + id: 'test-1', + steps: [{ action: 'wait', duration: 100 }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'positional.spec.json', specContent); + + // Pass file path as positional argument (after --editor) + const result = await spawnWithTimeout(['--editor', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); +}); diff --git a/cli/test/builder/fixtures.mjs b/cli/test/builder/fixtures.mjs new file mode 100644 index 0000000..c90bd19 --- /dev/null +++ b/cli/test/builder/fixtures.mjs @@ -0,0 +1,270 @@ +/** + * Test data factories for CLI builder tests + * + * These factories create valid test objects with sensible defaults, + * accepting optional partial overrides following the project pattern. + */ + +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); +const { schemas } = require('doc-detective-common'); + +/** + * Create a mock spec object with sensible defaults. + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid spec object + */ +export const getMockSpec = (overrides = {}) => { + return { + specId: 'test-spec', + description: 'Test specification', + tests: [], + ...overrides, + }; +}; + +/** + * Create a mock test object with sensible defaults. + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid test object + */ +export const getMockTest = (overrides = {}) => { + return { + testId: 'test-1', + description: 'Test description', + steps: [], + ...overrides, + }; +}; + +/** + * Create a mock step object with sensible defaults. + * @param {string} actionType - The step action type (e.g., 'goTo', 'click', 'find') + * @param {*} actionValue - The value for the action + * @param {Object} overrides - Optional partial overrides for additional step properties + * @returns {Object} A valid step object + */ +export const getMockStep = (actionType = 'goTo', actionValue = 'https://example.com', overrides = {}) => { + return { + [actionType]: actionValue, + ...overrides, + }; +}; + +/** + * Create a mock goTo step. + * @param {string} url - The URL to navigate to + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid goTo step + */ +export const getMockGoToStep = (url = 'https://example.com', overrides = {}) => { + return getMockStep('goTo', url, overrides); +}; + +/** + * Create a mock click step. + * @param {string|Object} selectorOrOptions - CSS selector string or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid click step + */ +export const getMockClickStep = (selectorOrOptions = '.button', overrides = {}) => { + return getMockStep('click', selectorOrOptions, overrides); +}; + +/** + * Create a mock find step. + * @param {string|Object} selectorOrOptions - CSS selector string or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid find step + */ +export const getMockFindStep = (selectorOrOptions = '.element', overrides = {}) => { + return getMockStep('find', selectorOrOptions, overrides); +}; + +/** + * Create a mock type step. + * @param {string[]|Object} keysOrOptions - Array of keys or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid type step + */ +export const getMockTypeStep = (keysOrOptions = ['test input'], overrides = {}) => { + return getMockStep('type', keysOrOptions, overrides); +}; + +/** + * Create a mock screenshot step. + * @param {string|Object} pathOrOptions - Screenshot path or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid screenshot step + */ +export const getMockScreenshotStep = (pathOrOptions = 'screenshot.png', overrides = {}) => { + return getMockStep('screenshot', pathOrOptions, overrides); +}; + +/** + * Create a mock httpRequest step. + * @param {Object} options - HTTP request options + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid httpRequest step + */ +export const getMockHttpRequestStep = (options = {}, overrides = {}) => { + const defaultOptions = { + url: 'https://api.example.com/endpoint', + method: 'GET', + ...options, + }; + return getMockStep('httpRequest', defaultOptions, overrides); +}; + +/** + * Create a mock runShell step. + * @param {string|Object} commandOrOptions - Shell command or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid runShell step + */ +export const getMockRunShellStep = (commandOrOptions = 'echo "test"', overrides = {}) => { + return getMockStep('runShell', commandOrOptions, overrides); +}; + +/** + * Create a mock wait step. + * @param {number|Object} durationOrOptions - Duration in ms or options object + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid wait step + */ +export const getMockWaitStep = (durationOrOptions = 1000, overrides = {}) => { + return getMockStep('wait', durationOrOptions, overrides); +}; + +/** + * Create a mock source location object for inline tests/steps. + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A valid source location object + */ +export const getMockSourceLocation = (overrides = {}) => { + return { + file: '/path/to/source.md', + isInline: true, + startOffset: 0, + endOffset: 50, + commentFormat: 'htmlComment', + originalText: '', + isAutoDetected: false, + ...overrides, + }; +}; + +/** + * Create a mock step with source location metadata. + * @param {string} actionType - The step action type + * @param {*} actionValue - The value for the action + * @param {Object} sourceLocationOverrides - Overrides for the source location + * @returns {Object} A step with sourceLocation property + */ +export const getMockInlineStep = ( + actionType = 'goTo', + actionValue = 'https://example.com', + sourceLocationOverrides = {} +) => { + return { + [actionType]: actionValue, + sourceLocation: getMockSourceLocation(sourceLocationOverrides), + }; +}; + +/** + * Create a complete mock spec with tests and steps. + * @param {Object} options - Options for spec creation + * @param {number} options.testCount - Number of tests to create (default: 1) + * @param {number} options.stepsPerTest - Number of steps per test (default: 2) + * @param {Object} options.specOverrides - Overrides for the spec + * @returns {Object} A complete spec with tests and steps + */ +export const getMockCompleteSpec = (options = {}) => { + const { testCount = 1, stepsPerTest = 2, specOverrides = {} } = options; + + const tests = []; + for (let t = 0; t < testCount; t++) { + const steps = []; + + // First step is always goTo for browser tests + steps.push(getMockGoToStep(`https://example.com/page${t + 1}`)); + + // Add additional steps + for (let s = 1; s < stepsPerTest; s++) { + const stepTypes = ['find', 'click', 'screenshot']; + const stepType = stepTypes[s % stepTypes.length]; + + switch (stepType) { + case 'find': + steps.push(getMockFindStep(`#element-${t}-${s}`)); + break; + case 'click': + steps.push(getMockClickStep(`#button-${t}-${s}`)); + break; + case 'screenshot': + steps.push(getMockScreenshotStep(`screenshot-${t}-${s}.png`)); + break; + } + } + + tests.push(getMockTest({ + testId: `test-${t + 1}`, + description: `Test ${t + 1} description`, + steps, + })); + } + + return getMockSpec({ + specId: 'complete-spec', + description: 'Complete test specification', + tests, + ...specOverrides, + }); +}; + +/** + * Create a mock runner result for DebugRunner tests. + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A mock step execution result + */ +export const getMockStepResult = (overrides = {}) => { + return { + status: 'PASS', + description: 'Step completed successfully', + ...overrides, + }; +}; + +/** + * Create a failed mock runner result. + * @param {string} errorMessage - The error message + * @param {Object} overrides - Optional partial overrides + * @returns {Object} A mock failed step execution result + */ +export const getMockFailedStepResult = (errorMessage = 'Element not found', overrides = {}) => { + return getMockStepResult({ + status: 'FAIL', + description: errorMessage, + ...overrides, + }); +}; + +export default { + getMockSpec, + getMockTest, + getMockStep, + getMockGoToStep, + getMockClickStep, + getMockFindStep, + getMockTypeStep, + getMockScreenshotStep, + getMockHttpRequestStep, + getMockRunShellStep, + getMockWaitStep, + getMockSourceLocation, + getMockInlineStep, + getMockCompleteSpec, + getMockStepResult, + getMockFailedStepResult, +}; diff --git a/cli/test/builder/schemaUtils.test.mjs b/cli/test/builder/schemaUtils.test.mjs new file mode 100644 index 0000000..9bc488e --- /dev/null +++ b/cli/test/builder/schemaUtils.test.mjs @@ -0,0 +1,575 @@ +/** + * Tests for schemaUtils.mjs - Schema utilities for the interactive test builder + * + * Tests the schema extraction and validation functions that power the builder UI. + */ + +import { createRequire } from 'module'; +const require = createRequire(import.meta.url); + +import { + getMockSpec, + getMockTest, + getMockStep, + getMockGoToStep, + getMockClickStep, + getMockCompleteSpec, +} from './fixtures.mjs'; + +import { + getStepTypes, + getStepTypeSchema, + getCommonStepProperties, + getStepTypeVariants, + getFieldVariants, + detectVariantIndex, + extractFieldInfo, + getStepTypeFields, + getSpecFields, + getTestFields, + validateStep, + validateTest, + validateSpec, + validatePattern, + describePattern, + getStepTypeInfo, + createDefaultStep, + createDefaultTest, + createDefaultSpec, + getBrowserActions, + getStepActionType, + stepRequiresBrowser, +} from '../../src/cli/builder/schemaUtils.mjs'; + +describe('schemaUtils', function () { + describe('getStepTypes', function () { + it('returns an array of step type names', function () { + const stepTypes = getStepTypes(); + + expect(stepTypes).to.be.an('array'); + expect(stepTypes.length).to.be.greaterThan(0); + }); + + it('includes common action types', function () { + const stepTypes = getStepTypes(); + + expect(stepTypes).to.include('goTo'); + expect(stepTypes).to.include('click'); + expect(stepTypes).to.include('find'); + expect(stepTypes).to.include('type'); + expect(stepTypes).to.include('screenshot'); + expect(stepTypes).to.include('httpRequest'); + expect(stepTypes).to.include('runShell'); + expect(stepTypes).to.include('wait'); + }); + + it('returns sorted step types', function () { + const stepTypes = getStepTypes(); + const sorted = [...stepTypes].sort(); + + expect(stepTypes).to.deep.equal(sorted); + }); + }); + + describe('getStepTypeSchema', function () { + it('returns schema for valid step type', function () { + const schema = getStepTypeSchema('goTo'); + + expect(schema).to.be.an('object'); + expect(schema).to.have.property('anyOf').or.have.property('type'); + }); + + it('returns null for invalid step type', function () { + const schema = getStepTypeSchema('nonExistentStepType'); + + expect(schema).to.be.null; + }); + + it('returns schemas with descriptions', function () { + const schema = getStepTypeSchema('click'); + + expect(schema).to.have.property('description').or.have.property('title'); + }); + }); + + describe('getCommonStepProperties', function () { + it('returns common step properties object', function () { + const commonProps = getCommonStepProperties(); + + expect(commonProps).to.be.an('object'); + }); + }); + + describe('getStepTypeVariants', function () { + it('returns variants for step types with anyOf', function () { + const variants = getStepTypeVariants('goTo'); + + // goTo should support string (simple) and object (detailed) forms + expect(variants).to.be.an('array'); + }); + + it('returns empty array for step type without variants', function () { + const variants = getStepTypeVariants('nonExistentType'); + + expect(variants).to.deep.equal([]); + }); + + it('each variant has expected properties', function () { + const variants = getStepTypeVariants('goTo'); + + if (variants.length > 0) { + const variant = variants[0]; + expect(variant).to.have.property('index'); + expect(variant).to.have.property('title'); + expect(variant).to.have.property('type'); + expect(variant).to.have.property('schema'); + } + }); + }); + + describe('detectVariantIndex', function () { + it('returns 0 for undefined value', function () { + const variants = [{ type: 'string' }, { type: 'object' }]; + const index = detectVariantIndex(undefined, variants); + + expect(index).to.equal(0); + }); + + it('detects string variant correctly', function () { + const variants = [{ type: 'object' }, { type: 'string' }]; + const index = detectVariantIndex('https://example.com', variants); + + expect(index).to.equal(1); + }); + + it('detects object variant correctly', function () { + const variants = [{ type: 'string' }, { type: 'object' }]; + const index = detectVariantIndex({ url: 'https://example.com' }, variants); + + expect(index).to.equal(1); + }); + + it('returns 0 for empty variants array', function () { + const index = detectVariantIndex('test', []); + + expect(index).to.equal(0); + }); + + it('detects null variant correctly', function () { + const variants = [{ type: 'string' }, { type: 'null' }]; + const index = detectVariantIndex(null, variants); + + expect(index).to.equal(1); + }); + }); + + describe('extractFieldInfo', function () { + it('extracts basic field information', function () { + const prop = { + type: 'string', + description: 'Test field', + default: 'default value', + }; + + const info = extractFieldInfo(prop, 'testField'); + + expect(info.name).to.equal('testField'); + expect(info.type).to.equal('string'); + expect(info.description).to.equal('Test field'); + expect(info.default).to.equal('default value'); + }); + + it('extracts enum information', function () { + const prop = { + type: 'string', + enum: ['option1', 'option2', 'option3'], + }; + + const info = extractFieldInfo(prop, 'enumField'); + + expect(info.type).to.equal('enum'); + expect(info.enum).to.deep.equal(['option1', 'option2', 'option3']); + }); + + it('extracts pattern information', function () { + const prop = { + type: 'string', + pattern: '^https?://', + }; + + const info = extractFieldInfo(prop, 'urlField'); + + expect(info.pattern).to.equal('^https?://'); + }); + + it('extracts anyOf information', function () { + const prop = { + anyOf: [ + { type: 'string' }, + { type: 'number' }, + ], + }; + + const info = extractFieldInfo(prop, 'unionField'); + + expect(info.anyOf).to.deep.equal(prop.anyOf); + expect(info.type).to.equal('string|number'); + }); + }); + + describe('getStepTypeFields', function () { + it('returns fields and required fields for valid step type', function () { + const { fields, requiredFields } = getStepTypeFields('goTo'); + + expect(fields).to.be.an('array'); + expect(requiredFields).to.be.an('array'); + }); + + it('returns empty arrays for invalid step type', function () { + const { fields, requiredFields } = getStepTypeFields('nonExistentType'); + + expect(fields).to.deep.equal([]); + expect(requiredFields).to.deep.equal([]); + }); + }); + + describe('getSpecFields', function () { + it('returns spec fields', function () { + const { fields, requiredFields } = getSpecFields(); + + expect(fields).to.be.an('array'); + expect(requiredFields).to.be.an('array'); + }); + + it('does not include tests field', function () { + const { fields } = getSpecFields(); + const testsField = fields.find(f => f.name === 'tests'); + + expect(testsField).to.be.undefined; + }); + + it('does not include $schema field', function () { + const { fields } = getSpecFields(); + const schemaField = fields.find(f => f.name === '$schema'); + + expect(schemaField).to.be.undefined; + }); + }); + + describe('getTestFields', function () { + it('returns test fields', function () { + const { fields, requiredFields } = getTestFields(); + + expect(fields).to.be.an('array'); + expect(requiredFields).to.be.an('array'); + }); + + it('does not include steps field', function () { + const { fields } = getTestFields(); + const stepsField = fields.find(f => f.name === 'steps'); + + expect(stepsField).to.be.undefined; + }); + }); + + describe('validateStep', function () { + it('validates a correct goTo step', function () { + const step = getMockGoToStep('https://example.com'); + const result = validateStep(step); + + expect(result.valid).to.be.true; + }); + + it('validates a correct click step', function () { + const step = getMockClickStep('.button'); + const result = validateStep(step); + + expect(result.valid).to.be.true; + }); + + it('returns validation errors for invalid step', function () { + const step = { unknownAction: 'value' }; + const result = validateStep(step); + + expect(result.valid).to.be.false; + }); + }); + + describe('validateTest', function () { + it('validates a correct test', function () { + const test = getMockTest({ + steps: [getMockGoToStep()], + }); + const result = validateTest(test); + + expect(result.valid).to.be.true; + }); + + it('validates a test with multiple steps', function () { + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.button'), + ], + }); + const result = validateTest(test); + + expect(result.valid).to.be.true; + }); + }); + + describe('validateSpec', function () { + it('validates a correct spec', function () { + const spec = getMockCompleteSpec({ testCount: 1, stepsPerTest: 2 }); + const result = validateSpec(spec); + + expect(result.valid).to.be.true; + }); + + it('validates an empty spec', function () { + const spec = getMockSpec(); + const result = validateSpec(spec); + + expect(result.valid).to.be.true; + }); + + it('returns validation errors for invalid spec', function () { + const spec = { tests: 'not an array' }; + const result = validateSpec(spec); + + expect(result.valid).to.be.false; + }); + }); + + describe('validatePattern', function () { + it('returns true for matching pattern', function () { + const result = validatePattern('https://example.com', '^https?://'); + + expect(result).to.be.true; + }); + + it('returns false for non-matching pattern', function () { + const result = validatePattern('ftp://example.com', '^https?://'); + + expect(result).to.be.false; + }); + + it('returns true for null/undefined value', function () { + expect(validatePattern(null, '^test')).to.be.true; + expect(validatePattern(undefined, '^test')).to.be.true; + }); + + it('returns true for null/undefined pattern', function () { + expect(validatePattern('test', null)).to.be.true; + expect(validatePattern('test', undefined)).to.be.true; + }); + + it('returns true for invalid regex pattern', function () { + const result = validatePattern('test', '[invalid(regex'); + + expect(result).to.be.true; + }); + }); + + describe('describePattern', function () { + it('returns empty string for null pattern', function () { + const description = describePattern(null); + + expect(description).to.equal(''); + }); + + it('returns human-readable description for known patterns', function () { + const description = describePattern('(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)'); + + expect(description).to.include('http'); + }); + + it('returns pattern itself for unknown patterns', function () { + const pattern = '^custom-pattern$'; + const description = describePattern(pattern); + + expect(description).to.include(pattern); + }); + }); + + describe('getStepTypeInfo', function () { + it('returns description and examples for valid step type', function () { + const info = getStepTypeInfo('goTo'); + + expect(info).to.have.property('description'); + expect(info).to.have.property('examples'); + }); + + it('returns empty values for invalid step type', function () { + const info = getStepTypeInfo('nonExistentType'); + + expect(info.description).to.equal(''); + expect(info.examples).to.deep.equal([]); + }); + }); + + describe('createDefaultStep', function () { + it('creates default goTo step', function () { + const step = createDefaultStep('goTo'); + + expect(step).to.have.property('goTo'); + }); + + it('creates default click step', function () { + const step = createDefaultStep('click'); + + expect(step).to.have.property('click'); + }); + + it('creates default find step', function () { + const step = createDefaultStep('find'); + + expect(step).to.have.property('find'); + }); + + it('creates valid steps that pass validation', function () { + const stepTypes = getStepTypes(); + + for (const stepType of stepTypes) { + const step = createDefaultStep(stepType); + expect(step).to.have.property(stepType); + } + }); + }); + + describe('createDefaultTest', function () { + it('creates test with expected properties', function () { + const test = createDefaultTest(); + + expect(test).to.have.property('testId'); + expect(test).to.have.property('description'); + expect(test).to.have.property('steps'); + expect(test.steps).to.be.an('array'); + expect(test.steps).to.have.lengthOf(0); + }); + }); + + describe('createDefaultSpec', function () { + it('creates spec with expected properties', function () { + const spec = createDefaultSpec('my-spec'); + + expect(spec).to.have.property('specId', 'my-spec'); + expect(spec).to.have.property('description'); + expect(spec).to.have.property('tests'); + expect(spec.tests).to.be.an('array'); + expect(spec.tests).to.have.lengthOf(0); + }); + + it('creates spec with empty specId when not provided', function () { + const spec = createDefaultSpec(); + + expect(spec.specId).to.equal(''); + }); + }); + + describe('getBrowserActions', function () { + it('returns array of browser-requiring action types', function () { + const browserActions = getBrowserActions(); + + expect(browserActions).to.be.an('array'); + expect(browserActions).to.include('click'); + expect(browserActions).to.include('find'); + expect(browserActions).to.include('type'); + expect(browserActions).to.include('screenshot'); + }); + + it('does not include non-browser actions', function () { + const browserActions = getBrowserActions(); + + expect(browserActions).to.not.include('goTo'); + expect(browserActions).to.not.include('httpRequest'); + expect(browserActions).to.not.include('runShell'); + }); + }); + + describe('getStepActionType', function () { + it('returns action type for goTo step', function () { + const step = getMockGoToStep(); + const actionType = getStepActionType(step); + + expect(actionType).to.equal('goTo'); + }); + + it('returns action type for click step', function () { + const step = getMockClickStep(); + const actionType = getStepActionType(step); + + expect(actionType).to.equal('click'); + }); + + it('returns null for step without recognized action', function () { + const step = { unknownProp: 'value' }; + const actionType = getStepActionType(step); + + expect(actionType).to.be.null; + }); + + it('ignores common step properties', function () { + const step = { + goTo: 'https://example.com', + description: 'Navigate to page', + stepId: 'step-1', + }; + const actionType = getStepActionType(step); + + expect(actionType).to.equal('goTo'); + }); + }); + + describe('stepRequiresBrowser', function () { + it('returns true for click step', function () { + const step = getMockClickStep(); + + expect(stepRequiresBrowser(step)).to.be.true; + }); + + it('returns true for find step', function () { + const step = getMockStep('find', '.element'); + + expect(stepRequiresBrowser(step)).to.be.true; + }); + + it('returns true for type step', function () { + const step = getMockStep('type', ['test']); + + expect(stepRequiresBrowser(step)).to.be.true; + }); + + it('returns true for screenshot step', function () { + const step = getMockStep('screenshot', 'test.png'); + + expect(stepRequiresBrowser(step)).to.be.true; + }); + + it('returns false for goTo step', function () { + const step = getMockGoToStep(); + + expect(stepRequiresBrowser(step)).to.be.false; + }); + + it('returns false for httpRequest step', function () { + const step = getMockStep('httpRequest', { url: 'https://api.example.com' }); + + expect(stepRequiresBrowser(step)).to.be.false; + }); + + it('returns false for runShell step', function () { + const step = getMockStep('runShell', 'echo test'); + + expect(stepRequiresBrowser(step)).to.be.false; + }); + }); +}); + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); diff --git a/cli/test/builder/sourceFileUtils.test.mjs b/cli/test/builder/sourceFileUtils.test.mjs new file mode 100644 index 0000000..c1f2775 --- /dev/null +++ b/cli/test/builder/sourceFileUtils.test.mjs @@ -0,0 +1,816 @@ +/** + * Tests for sourceFileUtils.js - Source file update utilities for inline test editing + * + * Tests serialization, syntax detection, and file update operations. + */ + +import { createRequire } from 'module'; +import * as fs from 'fs'; +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const { + serializeStepToInline, + serializeTestToInline, + detectSyntaxFormat, + serializeToSyntax, + getDefaultCommentFormat, + canSerializeAsSimple, + hasTestMetadata, + getFileContentHash, + findLineStart, + findLineEnd, + getLineIndentation, + hasSourceFileChanged, + updateSourceContent, + insertSourceContent, + batchUpdateSourceContent, + hasInlineSourceLocations, + getInlineSourceFiles, + isAutoDetectedStep, + prepareSourceUpdates, + hasAutoDetectedSteps, +} = require('../../src/cli/builder/sourceFileUtils.js'); + +import { + getMockSpec, + getMockTest, + getMockStep, + getMockGoToStep, + getMockSourceLocation, + getMockInlineStep, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('sourceFileUtils', function () { + // Temp file handling + const tempDir = path.join(__dirname, 'temp'); + + before(function () { + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + }); + + afterEach(function () { + // Clean up temp files after each test + const files = fs.readdirSync(tempDir); + for (const file of files) { + fs.unlinkSync(path.join(tempDir, file)); + } + }); + + after(function () { + // Remove temp directory + if (fs.existsSync(tempDir)) { + fs.rmdirSync(tempDir); + } + }); + + describe('detectSyntaxFormat', function () { + it('detects JSON format from object syntax', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.equal('json'); + }); + + it('detects YAML format from key: value syntax', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.equal('yaml'); + }); + + it('detects XML format from attribute syntax', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.equal('xml'); + }); + + it('returns null for empty input', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.be.null; + }); + + it('returns null for undefined input', function () { + const result = detectSyntaxFormat(undefined); + + expect(result).to.be.null; + }); + + it('handles JSX comment format', function () { + const result = detectSyntaxFormat('{/* step {"goTo": "url"} */}'); + + expect(result).to.equal('json'); + }); + + it('handles multiline YAML format', function () { + const result = detectSyntaxFormat(''); + + expect(result).to.equal('yaml'); + }); + }); + + describe('serializeToSyntax', function () { + it('serializes to JSON format', function () { + const obj = { goTo: 'https://example.com' }; + const result = serializeToSyntax(obj, 'json', 'step'); + + expect(result).to.equal('{"goTo":"https://example.com"}'); + }); + + it('serializes to YAML format', function () { + const obj = { goTo: 'https://example.com' }; + const result = serializeToSyntax(obj, 'yaml', 'step'); + + expect(result).to.include('goTo:'); + }); + + it('serializes to XML format', function () { + const obj = { goTo: 'https://example.com' }; + const result = serializeToSyntax(obj, 'xml', 'step'); + + expect(result).to.include('goTo="https://example.com"'); + }); + + it('handles boolean values in XML format', function () { + const obj = { enabled: true }; + const result = serializeToSyntax(obj, 'xml', 'step'); + + expect(result).to.include('enabled=true'); + }); + + it('handles number values in XML format', function () { + const obj = { timeout: 5000 }; + const result = serializeToSyntax(obj, 'xml', 'step'); + + expect(result).to.include('timeout=5000'); + }); + }); + + describe('getDefaultCommentFormat', function () { + it('returns htmlComment for .md files', function () { + expect(getDefaultCommentFormat('.md')).to.equal('htmlComment'); + }); + + it('returns htmlComment for .html files', function () { + expect(getDefaultCommentFormat('.html')).to.equal('htmlComment'); + }); + + it('returns jsxComment for .jsx files', function () { + expect(getDefaultCommentFormat('.jsx')).to.equal('jsxComment'); + }); + + it('returns jsxComment for .tsx files', function () { + expect(getDefaultCommentFormat('.tsx')).to.equal('jsxComment'); + }); + + it('returns jsxComment for .mdx files', function () { + expect(getDefaultCommentFormat('.mdx')).to.equal('jsxComment'); + }); + + it('returns htmlComment for unknown extensions', function () { + expect(getDefaultCommentFormat('.unknown')).to.equal('htmlComment'); + }); + + it('handles null/undefined extension', function () { + expect(getDefaultCommentFormat(null)).to.equal('htmlComment'); + expect(getDefaultCommentFormat(undefined)).to.equal('htmlComment'); + }); + }); + + describe('serializeStepToInline', function () { + it('serializes simple goTo step to HTML comment', function () { + const step = getMockGoToStep('https://example.com'); + const result = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(result).to.match(/^$/); + expect(result).to.include('goTo'); + expect(result).to.include('https://example.com'); + }); + + it('serializes step to JSX comment format', function () { + const step = getMockGoToStep('https://example.com'); + const result = serializeStepToInline({ + step, + commentFormat: 'jsxComment', + }); + + expect(result).to.match(/^\{\s*\/\*/); + expect(result).to.match(/\*\/\s*\}$/); + }); + + it('removes sourceLocation from serialized output', function () { + const step = getMockInlineStep('goTo', 'https://example.com'); + const result = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(result).to.not.include('sourceLocation'); + }); + + it('uses simple format for simple steps', function () { + const step = { goTo: 'https://example.com' }; + const result = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(result).to.include('goTo:'); + }); + + it('preserves original syntax format when available', function () { + const step = { goTo: 'https://example.com' }; + const result = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + originalText: '', + }); + + // Should detect YAML format from original and use it + expect(result).to.include('goTo:'); + }); + }); + + describe('serializeTestToInline', function () { + it('serializes test declaration to HTML comment', function () { + const test = getMockTest({ testId: 'my-test', description: 'Test description' }); + const result = serializeTestToInline({ + test, + commentFormat: 'htmlComment', + }); + + expect(result).to.match(/^$/); + }); + + it('includes testId in serialized output', function () { + const test = getMockTest({ testId: 'my-test' }); + const result = serializeTestToInline({ + test, + commentFormat: 'htmlComment', + }); + + expect(result).to.include('testId'); + expect(result).to.include('my-test'); + }); + + it('includes description in serialized output', function () { + const test = getMockTest({ description: 'My test description' }); + const result = serializeTestToInline({ + test, + commentFormat: 'htmlComment', + }); + + expect(result).to.include('description'); + }); + }); + + describe('canSerializeAsSimple', function () { + it('returns true for step with only action', function () { + const step = { goTo: 'https://example.com' }; + + expect(canSerializeAsSimple(step, 'goTo')).to.be.true; + }); + + it('returns false for step with additional properties', function () { + const step = { goTo: 'https://example.com', description: 'Navigate' }; + + expect(canSerializeAsSimple(step, 'goTo')).to.be.false; + }); + + it('returns false for step with object action value', function () { + const step = { goTo: { url: 'https://example.com', timeout: 5000 } }; + + expect(canSerializeAsSimple(step, 'goTo')).to.be.false; + }); + + it('returns true for boolean action value', function () { + const step = { wait: true }; + + expect(canSerializeAsSimple(step, 'wait')).to.be.true; + }); + + it('returns true for numeric action value', function () { + const step = { wait: 5000 }; + + expect(canSerializeAsSimple(step, 'wait')).to.be.true; + }); + }); + + describe('hasTestMetadata', function () { + it('returns true for test with testId', function () { + const test = { testId: 'my-test', steps: [] }; + + expect(hasTestMetadata(test)).to.be.true; + }); + + it('returns true for test with description', function () { + const test = { description: 'My test', steps: [] }; + + expect(hasTestMetadata(test)).to.be.true; + }); + + it('returns false for test with only steps', function () { + const test = { steps: [{ goTo: 'https://example.com' }] }; + + expect(hasTestMetadata(test)).to.be.false; + }); + + it('returns false for null/undefined', function () { + expect(hasTestMetadata(null)).to.be.false; + expect(hasTestMetadata(undefined)).to.be.false; + }); + }); + + describe('getFileContentHash', function () { + it('returns hash for existing file', function () { + const tempFile = path.join(tempDir, 'hash-test.txt'); + fs.writeFileSync(tempFile, 'test content'); + + const hash = getFileContentHash(tempFile); + + expect(hash).to.be.a('string'); + expect(hash).to.have.lengthOf(32); // MD5 hex length + }); + + it('returns null for non-existent file', function () { + const hash = getFileContentHash('/non/existent/file.txt'); + + expect(hash).to.be.null; + }); + + it('returns consistent hash for same content', function () { + const tempFile = path.join(tempDir, 'hash-consistent.txt'); + fs.writeFileSync(tempFile, 'consistent content'); + + const hash1 = getFileContentHash(tempFile); + const hash2 = getFileContentHash(tempFile); + + expect(hash1).to.equal(hash2); + }); + + it('returns different hash for different content', function () { + const tempFile1 = path.join(tempDir, 'hash-diff1.txt'); + const tempFile2 = path.join(tempDir, 'hash-diff2.txt'); + fs.writeFileSync(tempFile1, 'content 1'); + fs.writeFileSync(tempFile2, 'content 2'); + + const hash1 = getFileContentHash(tempFile1); + const hash2 = getFileContentHash(tempFile2); + + expect(hash1).to.not.equal(hash2); + }); + }); + + describe('findLineStart', function () { + it('finds start of first line', function () { + const content = 'first line\nsecond line'; + + expect(findLineStart(content, 5)).to.equal(0); + }); + + it('finds start of second line', function () { + const content = 'first line\nsecond line'; + + expect(findLineStart(content, 15)).to.equal(11); + }); + + it('handles offset at start of file', function () { + const content = 'line content'; + + expect(findLineStart(content, 0)).to.equal(0); + }); + }); + + describe('findLineEnd', function () { + it('finds end of first line', function () { + const content = 'first line\nsecond line'; + + expect(findLineEnd(content, 5)).to.equal(11); // After newline + }); + + it('finds end of last line', function () { + const content = 'first line\nsecond line'; + + expect(findLineEnd(content, 15)).to.equal(22); // End of content + }); + }); + + describe('getLineIndentation', function () { + it('returns spaces for space-indented line', function () { + const content = ' indented line'; + + expect(getLineIndentation(content, 0)).to.equal(' '); + }); + + it('returns tabs for tab-indented line', function () { + const content = '\t\tindented line'; + + expect(getLineIndentation(content, 0)).to.equal('\t\t'); + }); + + it('returns empty string for non-indented line', function () { + const content = 'not indented'; + + expect(getLineIndentation(content, 0)).to.equal(''); + }); + }); + + describe('hasSourceFileChanged', function () { + it('returns false when file has not changed', function () { + const tempFile = path.join(tempDir, 'unchanged.txt'); + fs.writeFileSync(tempFile, 'original content'); + + const hash = getFileContentHash(tempFile); + + expect(hasSourceFileChanged(tempFile, hash)).to.be.false; + }); + + it('returns true when file has changed', function () { + const tempFile = path.join(tempDir, 'changed.txt'); + fs.writeFileSync(tempFile, 'original content'); + + const hash = getFileContentHash(tempFile); + fs.writeFileSync(tempFile, 'modified content'); + + expect(hasSourceFileChanged(tempFile, hash)).to.be.true; + }); + + it('returns true for non-existent file', function () { + expect(hasSourceFileChanged('/non/existent/file.txt', 'somehash')).to.be.true; + }); + }); + + describe('updateSourceContent', function () { + it('replaces content at specified offsets', function () { + const tempFile = path.join(tempDir, 'update-test.txt'); + fs.writeFileSync(tempFile, 'Hello World'); + + const result = updateSourceContent({ + filePath: tempFile, + startOffset: 6, + endOffset: 11, + newContent: 'Universe', + }); + + expect(result.success).to.be.true; + expect(fs.readFileSync(tempFile, 'utf8')).to.equal('Hello Universe'); + }); + + it('returns offset delta', function () { + const tempFile = path.join(tempDir, 'delta-test.txt'); + fs.writeFileSync(tempFile, 'short'); + + const result = updateSourceContent({ + filePath: tempFile, + startOffset: 0, + endOffset: 5, + newContent: 'much longer text', + }); + + expect(result.success).to.be.true; + expect(result.offsetDelta).to.equal(11); // 16 - 5 + }); + + it('returns error for invalid offsets', function () { + const tempFile = path.join(tempDir, 'invalid-offset.txt'); + fs.writeFileSync(tempFile, 'content'); + + const result = updateSourceContent({ + filePath: tempFile, + startOffset: 100, + endOffset: 200, + newContent: 'new', + }); + + expect(result.success).to.be.false; + expect(result.error).to.include('Invalid offsets'); + }); + + it('returns error for non-existent file', function () { + const result = updateSourceContent({ + filePath: '/non/existent/file.txt', + startOffset: 0, + endOffset: 5, + newContent: 'new', + }); + + expect(result.success).to.be.false; + }); + }); + + describe('batchUpdateSourceContent', function () { + it('applies multiple updates in correct order', function () { + const tempFile = path.join(tempDir, 'batch-test.txt'); + fs.writeFileSync(tempFile, 'line1\nline2\nline3'); + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [ + { startOffset: 0, endOffset: 5, newContent: 'first' }, + { startOffset: 12, endOffset: 17, newContent: 'third' }, + ], + }); + + expect(result.success).to.be.true; + expect(fs.readFileSync(tempFile, 'utf8')).to.equal('first\nline2\nthird'); + }); + + it('handles replaceEntireLine option', function () { + const tempFile = path.join(tempDir, 'replace-line.txt'); + fs.writeFileSync(tempFile, ' indented line\nnext line'); + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [ + { startOffset: 2, endOffset: 15, newContent: 'new content', replaceEntireLine: true }, + ], + }); + + expect(result.success).to.be.true; + const content = fs.readFileSync(tempFile, 'utf8'); + expect(content).to.include('new content'); + expect(content).to.include('next line'); + }); + + it('handles insertLineBefore option', function () { + const tempFile = path.join(tempDir, 'insert-before.txt'); + fs.writeFileSync(tempFile, ' existing line\n'); + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [ + { startOffset: 2, endOffset: 2, newContent: 'inserted line', insertLineBefore: true }, + ], + }); + + expect(result.success).to.be.true; + const content = fs.readFileSync(tempFile, 'utf8'); + expect(content.indexOf('inserted line')).to.be.lessThan(content.indexOf('existing line')); + }); + + it('handles insertLineAfter option', function () { + const tempFile = path.join(tempDir, 'insert-after.txt'); + fs.writeFileSync(tempFile, 'existing line\n'); + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [ + { startOffset: 0, endOffset: 13, newContent: 'inserted line', insertLineAfter: true }, + ], + }); + + expect(result.success).to.be.true; + const content = fs.readFileSync(tempFile, 'utf8'); + expect(content.indexOf('existing line')).to.be.lessThan(content.indexOf('inserted line')); + }); + + it('returns success for empty updates array', function () { + const result = batchUpdateSourceContent({ + filePath: '/any/path.txt', + updates: [], + }); + + expect(result.success).to.be.true; + expect(result.results).to.deep.equal([]); + }); + }); + + describe('hasInlineSourceLocations', function () { + it('returns false for spec without inline sources', function () { + const spec = getMockSpec({ + tests: [getMockTest({ steps: [getMockGoToStep()] })], + }); + + expect(hasInlineSourceLocations(spec)).to.be.false; + }); + + it('returns true for spec with inline step sources', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [getMockInlineStep('goTo', 'https://example.com')], + }), + ], + }); + + expect(hasInlineSourceLocations(spec)).to.be.true; + }); + + it('returns true for spec with inline test sources', function () { + const spec = getMockSpec({ + tests: [ + { + ...getMockTest(), + sourceLocation: getMockSourceLocation(), + }, + ], + }); + + expect(hasInlineSourceLocations(spec)).to.be.true; + }); + + it('returns false for null/undefined spec', function () { + expect(hasInlineSourceLocations(null)).to.be.false; + expect(hasInlineSourceLocations(undefined)).to.be.false; + }); + }); + + describe('getInlineSourceFiles', function () { + it('returns empty set for spec without inline sources', function () { + const spec = getMockSpec(); + const files = getInlineSourceFiles(spec); + + expect(files.size).to.equal(0); + }); + + it('returns unique file paths from inline sources', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'url1', { file: '/path/to/file1.md' }), + getMockInlineStep('click', '.btn', { file: '/path/to/file1.md' }), + getMockInlineStep('find', '.elem', { file: '/path/to/file2.md' }), + ], + }), + ], + }); + + const files = getInlineSourceFiles(spec); + + expect(files.size).to.equal(2); + expect(files.has('/path/to/file1.md')).to.be.true; + expect(files.has('/path/to/file2.md')).to.be.true; + }); + }); + + describe('isAutoDetectedStep', function () { + it('returns true for auto-detected step', function () { + const step = getMockInlineStep('goTo', 'url', { isAutoDetected: true }); + + expect(isAutoDetectedStep(step)).to.be.true; + }); + + it('returns false for explicit inline step', function () { + const step = getMockInlineStep('goTo', 'url', { isAutoDetected: false }); + + expect(isAutoDetectedStep(step)).to.be.false; + }); + + it('returns false for step without sourceLocation', function () { + const step = getMockGoToStep(); + + expect(isAutoDetectedStep(step)).to.be.false; + }); + }); + + describe('hasAutoDetectedSteps', function () { + it('returns true for spec with auto-detected steps', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [getMockInlineStep('goTo', 'url', { isAutoDetected: true })], + }), + ], + }); + + expect(hasAutoDetectedSteps(spec)).to.be.true; + }); + + it('returns false for spec without auto-detected steps', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [getMockGoToStep()], + }), + ], + }); + + expect(hasAutoDetectedSteps(spec)).to.be.false; + }); + }); + + describe('prepareSourceUpdates', function () { + it('returns empty map for spec without inline sources', function () { + const spec = getMockSpec({ + tests: [getMockTest({ steps: [getMockGoToStep()] })], + }); + + const updates = prepareSourceUpdates({ spec, originalSpec: spec }); + + expect(updates.size).to.equal(0); + }); + + it('includes updates for modified inline steps', function () { + const originalSpec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'https://old.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + }), + ], + }), + ], + }); + + const modifiedSpec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'https://new.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + }), + ], + }), + ], + }); + + const updates = prepareSourceUpdates({ spec: modifiedSpec, originalSpec }); + + expect(updates.size).to.equal(1); + expect(updates.has('/path/to/file.md')).to.be.true; + }); + + it('skips unmodified inline steps', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'https://example.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + }), + ], + }), + ], + }); + + // Same spec as original - no modifications + const updates = prepareSourceUpdates({ spec, originalSpec: spec }); + + expect(updates.size).to.equal(0); + }); + + it('handles auto-detected steps with insertLineAfter', function () { + const originalSpec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'https://old.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + isAutoDetected: true, + }), + ], + }), + ], + }); + + const modifiedSpec = getMockSpec({ + tests: [ + getMockTest({ + steps: [ + getMockInlineStep('goTo', 'https://new.com', { + file: '/path/to/file.md', + startOffset: 0, + endOffset: 50, + isAutoDetected: true, + }), + ], + }), + ], + }); + + const updates = prepareSourceUpdates({ spec: modifiedSpec, originalSpec }); + + expect(updates.size).to.equal(1); + const fileUpdates = updates.get('/path/to/file.md'); + expect(fileUpdates[0].insertLineAfter).to.be.true; + }); + }); +}); From 98ee5c6608e20f91658494651f298b9bd006e5f9 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 5 Dec 2025 18:24:29 -0800 Subject: [PATCH 14/90] Fix inline editing --- cli/src/cli/builder/TestBuilder.mjs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index 05cf848..53f55f2 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -991,7 +991,15 @@ const TestBuilder = ({ menuItems.push({ label: '🔍 Preview', value: 'preview' }); if (validation.valid && tests.length > 0) { - const saveLabel = isEditing ? '💾 Save (overwrite)' : '💾 Save specification'; + // Use different label based on whether spec has inline sources + let saveLabel; + if (hasInlineSources) { + saveLabel = '💾 Save changes'; + } else if (isEditing) { + saveLabel = '💾 Save (overwrite)'; + } else { + saveLabel = '💾 Save specification'; + } menuItems.push({ label: saveLabel, value: 'save' }); } else if (tests.length === 0) { menuItems.push({ @@ -1033,8 +1041,13 @@ const TestBuilder = ({ ), React.createElement( Box, - { marginBottom: 1 }, - React.createElement( + { flexDirection: 'column', marginBottom: 1 }, + // Show inline source info if spec has inline sources + hasInlineSources ? React.createElement( + Text, + { color: 'green', dimColor: true }, + `📝 Source: ${path.basename(inputFilePath || '')} (inline tests detected)` + ) : React.createElement( Text, { color: 'gray', dimColor: true }, `Output: ${filePath} (${outputFormat.toUpperCase()})` From c49fcabfa1412c04d98c95dea11b13e9c966872d Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Sat, 6 Dec 2025 06:27:57 -0800 Subject: [PATCH 15/90] More tests --- cli/package-lock.json | 137 ++++- cli/test/builder/SpecSelector.test.mjs | 496 ++++++++++++++++++ cli/test/builder/TestEditor.test.mjs | 676 +++++++++++++++++++++++++ cli/test/builder/editor.test.mjs | 219 +++++++- 4 files changed, 1503 insertions(+), 25 deletions(-) create mode 100644 cli/test/builder/SpecSelector.test.mjs create mode 100644 cli/test/builder/TestEditor.test.mjs diff --git a/cli/package-lock.json b/cli/package-lock.json index 14c99cd..65642e8 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -29,7 +29,9 @@ "body-parser": "^2.2.1", "chai": "^6.2.1", "express": "^5.1.0", - "mocha": "^11.7.5" + "ink-testing-library": "^4.0.0", + "mocha": "^11.7.5", + "sinon": "^19.0.2" } }, "../core": { @@ -368,6 +370,54 @@ "cross-spawn": "^7.0.6" } }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", + "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -417,6 +467,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1636,6 +1687,7 @@ "resolved": "https://registry.npmjs.org/ink/-/ink-6.5.1.tgz", "integrity": "sha512-wF3j/DmkM8q5E+OtfdQhCRw8/0ahkc8CUTgEddxZzpEWPslu7YPL3t64MWRoI9m6upVGpfAg4ms2BBvxCdKRLQ==", "license": "MIT", + "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.1", "ansi-escapes": "^7.2.0", @@ -1711,6 +1763,24 @@ "react": ">=18.0.0" } }, + "node_modules/ink-testing-library": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ink-testing-library/-/ink-testing-library-4.0.0.tgz", + "integrity": "sha512-yF92kj3pmBvk7oKbSq5vEALO//o7Z9Ck/OaLNlkzXNeYdwfpxMQkSowGTFUCS5MSu9bWfSZMewGpp7bFc66D7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": ">=18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/ink/node_modules/ansi-styles": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", @@ -1934,6 +2004,7 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } @@ -2008,6 +2079,13 @@ "node": ">=18.0.0" } }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2197,6 +2275,20 @@ "node": ">= 0.6" } }, + "node_modules/nise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", + "just-extend": "^6.2.0", + "path-to-regexp": "^8.1.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -2468,6 +2560,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -2763,6 +2856,38 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sinon": { + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.5.tgz", + "integrity": "sha512-r15s9/s+ub/d4bxNXqIUmwp6imVSdTorIRaxoecYjqTVLZ8RuoXr/4EDGwIBo6Waxn7f2gnURX9zuhAfCwaF6Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.5", + "@sinonjs/samsam": "^8.0.1", + "diff": "^7.0.0", + "nise": "^6.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/slice-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", @@ -2978,6 +3103,16 @@ "node": ">=0.6" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", diff --git a/cli/test/builder/SpecSelector.test.mjs b/cli/test/builder/SpecSelector.test.mjs new file mode 100644 index 0000000..dceb09e --- /dev/null +++ b/cli/test/builder/SpecSelector.test.mjs @@ -0,0 +1,496 @@ +/** + * Tests for SpecSelector.mjs - Spec selector component for choosing which spec to edit + * + * Uses ink-testing-library to render and test the Ink React component. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +import SpecSelector from '../../src/cli/builder/SpecSelector.mjs'; +import { + getMockSpec, + getMockTest, + getMockGoToStep, + getMockCompleteSpec, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('SpecSelector component', function () { + const tempDir = path.join(__dirname, 'temp'); + + describe('header display', function () { + it('displays Doc Detective Test Builder title', function () { + const specs = [{ + spec: getMockSpec({ specId: 'test-spec' }), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Doc Detective Test Builder'); + }); + + it('displays instruction to select a specification', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Select a specification to edit'); + }); + }); + + describe('spec count display', function () { + it('displays single spec count correctly', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Found 1 specification'); + }); + + it('displays multiple specs count correctly', function () { + const specs = [ + { + spec: getMockSpec({ specId: 'spec-1' }), + filePath: path.join(tempDir, 'test1.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + { + spec: getMockSpec({ specId: 'spec-2' }), + filePath: path.join(tempDir, 'test2.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + { + spec: getMockSpec({ specId: 'spec-3' }), + filePath: path.join(tempDir, 'test3.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + ]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Found 3 specifications'); + }); + }); + + describe('spec list display', function () { + it('displays spec ID', function () { + const specs = [{ + spec: getMockSpec({ specId: 'my-awesome-spec' }), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('my-awesome-spec'); + }); + + it('displays file name', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'unique-filename.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('unique-filename.spec.json'); + }); + + it('displays test count', function () { + const spec = getMockSpec({ + tests: [ + getMockTest({ steps: [getMockGoToStep()] }), + getMockTest({ steps: [getMockGoToStep()] }), + ], + }); + const specs = [{ + spec, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('2 tests'); + }); + + it('displays singular test label for one test', function () { + const spec = getMockSpec({ + tests: [getMockTest({ steps: [getMockGoToStep()] })], + }); + const specs = [{ + spec, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('1 test'); + }); + + it('displays zero tests count', function () { + const spec = getMockSpec({ tests: [] }); + const specs = [{ + spec, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('0 tests'); + }); + }); + + describe('validation status display', function () { + it('displays checkmark for valid spec', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('✅'); + }); + + it('displays warning for invalid spec', function () { + const specs = [{ + spec: { tests: 'invalid' }, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: false, + validationErrors: 'tests must be an array', + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('⚠️'); + }); + + it('displays validation error message for invalid spec', function () { + const specs = [{ + spec: { tests: 'invalid' }, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: false, + validationErrors: 'tests must be an array', + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('tests must be an array'); + }); + }); + + describe('menu options', function () { + it('displays create new specification option', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Create new specification'); + }); + + // Note: Exit option may be off-screen in ScrollableSelect with many items + // The component does have an exit option but it may not be visible in initial render + it('component includes menu items for navigation', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + // Should have navigation hints + expect(frame).to.include('↑↓'); + }); + }); + + describe('navigation hint', function () { + it('displays keyboard navigation hint', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('↑↓'); + expect(frame).to.include('Enter'); + }); + }); + + describe('multiple specs handling', function () { + it('displays all specs in list', function () { + const specs = [ + { + spec: getMockSpec({ specId: 'first-spec' }), + filePath: path.join(tempDir, 'first.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + { + spec: getMockSpec({ specId: 'second-spec' }), + filePath: path.join(tempDir, 'second.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + ]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('first-spec'); + expect(frame).to.include('second-spec'); + }); + + it('displays mix of valid and invalid specs', function () { + const specs = [ + { + spec: getMockSpec({ specId: 'valid-spec' }), + filePath: path.join(tempDir, 'valid.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }, + { + spec: { specId: 'invalid-spec', tests: 'not-array' }, + filePath: path.join(tempDir, 'invalid.spec.json'), + extension: '.json', + isValid: false, + validationErrors: 'tests must be array', + }, + ]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('✅'); + expect(frame).to.include('⚠️'); + }); + }); + + describe('fallback spec ID', function () { + it('uses id field when specId is not set', function () { + const specs = [{ + spec: { id: 'fallback-id', tests: [] }, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('fallback-id'); + }); + + it('uses Spec N when no id fields are set', function () { + const specs = [{ + spec: { tests: [] }, + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Spec 1'); + }); + }); + + describe('file path handling', function () { + it('handles null file path gracefully', function () { + const specs = [{ + spec: getMockSpec({ specId: 'no-file-spec' }), + filePath: null, + extension: null, + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('no-file-spec'); + }); + }); + + describe('different file extensions', function () { + it('handles JSON extension', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.json'), + extension: '.json', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.json'); + }); + + it('handles YAML extension', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.yaml'), + extension: '.yaml', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.yaml'); + }); + + it('handles YML extension', function () { + const specs = [{ + spec: getMockSpec(), + filePath: path.join(tempDir, 'test.spec.yml'), + extension: '.yml', + isValid: true, + validationErrors: null, + }]; + + const { lastFrame } = render( + React.createElement(SpecSelector, { specs, outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('.yml'); + }); + }); +}); diff --git a/cli/test/builder/TestEditor.test.mjs b/cli/test/builder/TestEditor.test.mjs new file mode 100644 index 0000000..1ac023c --- /dev/null +++ b/cli/test/builder/TestEditor.test.mjs @@ -0,0 +1,676 @@ +/** + * Tests for TestEditor.mjs - Test editor component + * + * Uses ink-testing-library to render and test the Ink React component. + */ + +import React from 'react'; +import { render } from 'ink-testing-library'; +import { createRequire } from 'module'; + +const require = createRequire(import.meta.url); + +import TestEditor from '../../src/cli/builder/TestEditor.mjs'; +import { + getMockTest, + getMockGoToStep, + getMockClickStep, + getMockFindStep, + getMockTypeStep, + getMockInlineStep, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('TestEditor component', function () { + // Common callback stubs + const noopCallbacks = { + onChange: () => {}, + onSave: () => {}, + onCancel: () => {}, + onDelete: () => {}, + }; + + describe('initial rendering', function () { + it('displays Edit Test header', function () { + const test = getMockTest({ description: 'My test' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Edit Test'); + }); + + it('displays test description in header', function () { + const test = getMockTest({ description: 'Navigation test suite' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Navigation test suite'); + }); + + it('displays correct test index in status bar', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 2, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test 3'); // 0-indexed to 1-indexed + }); + }); + + describe('menu structure', function () { + it('displays Test Properties section', function () { + const test = getMockTest({ testId: 'my-test' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test Properties'); + }); + + it('displays Steps section', function () { + const test = getMockTest({ steps: [] }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps'); + }); + + it('shows Add property option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add property'); + }); + + it('shows Delete property option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Delete property'); + }); + + it('shows Add step option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Add step'); + }); + + it('shows Preview JSON option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Preview JSON'); + }); + + it('shows Save test option for valid test', function () { + const test = getMockTest({ steps: [getMockGoToStep()] }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Save test'); + }); + + it('shows Delete test option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Delete test'); + }); + + it('shows Back option', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Back'); + }); + }); + + describe('test metadata display', function () { + it('displays testId when set', function () { + const test = getMockTest({ testId: 'nav-test-001' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('testId'); + expect(frame).to.include('nav-test-001'); + }); + + it('displays description when set', function () { + const test = getMockTest({ description: 'Test user login flow' }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('description'); + expect(frame).to.include('Test user login'); + }); + + it('truncates long values', function () { + const longDescription = 'A'.repeat(100); + const test = getMockTest({ description: longDescription }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('...'); + }); + }); + + describe('steps display', function () { + it('displays step count', function () { + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.button'), + getMockFindStep('.element'), + ], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps (3)'); + }); + + it('displays zero steps count', function () { + const test = getMockTest({ steps: [] }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps (0)'); + }); + + it('displays step type and number', function () { + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('1.'); + expect(frame).to.include('goTo'); + }); + + it('displays step value for string actions', function () { + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com/page')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('https://example.com/page'); + }); + + it('displays multiple steps in order', function () { + const test = getMockTest({ + steps: [ + getMockGoToStep('https://example.com'), + getMockClickStep('.submit'), + getMockFindStep('.result'), + ], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('1.'); + expect(frame).to.include('goTo'); + expect(frame).to.include('2.'); + expect(frame).to.include('click'); + expect(frame).to.include('3.'); + expect(frame).to.include('find'); + }); + + it('truncates long step values', function () { + const longUrl = 'https://example.com/' + 'a'.repeat(100); + const test = getMockTest({ + steps: [getMockGoToStep(longUrl)], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('...'); + }); + }); + + describe('step types handling', function () { + it('displays goTo step correctly', function () { + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + + it('displays click step correctly', function () { + const test = getMockTest({ + steps: [getMockClickStep('.button')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('click'); + }); + + it('displays find step correctly', function () { + const test = getMockTest({ + steps: [getMockFindStep('#element')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('find'); + }); + + it('displays type step correctly', function () { + const test = getMockTest({ + steps: [getMockTypeStep(['test input'])], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('type'); + }); + + it('handles step with object value', function () { + const test = getMockTest({ + steps: [{ + goTo: { + url: 'https://example.com', + wait: { duration: 5000 }, + }, + }], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + + it('handles step with unknown action type gracefully', function () { + const test = getMockTest({ + steps: [{ unknownAction: 'value' }], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('unknown'); + }); + }); + + describe('validation display', function () { + it('shows validation warning for invalid test', function () { + // A test with steps containing unknown action types might fail validation + const test = { + testId: 'test-1', + steps: [{ invalidStep: true }], + }; + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('validation errors'); + }); + + it('shows fix errors message for invalid test', function () { + const test = { + testId: 'test-1', + steps: [{ invalidStep: true }], + }; + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Fix errors'); + }); + + it('shows save option for valid test', function () { + const test = getMockTest({ + steps: [getMockGoToStep('https://example.com')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Save test'); + }); + }); + + describe('sourceLocation handling', function () { + it('does not display sourceLocation in step list', function () { + const test = getMockTest({ + steps: [getMockInlineStep('goTo', 'https://example.com')], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.not.include('sourceLocation'); + }); + }); + + describe('hint display', function () { + it('shows navigation hint', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('↑↓'); + expect(frame).to.include('Enter'); + }); + }); + + describe('steps with common properties', function () { + it('displays step with description', function () { + const test = getMockTest({ + steps: [{ + goTo: 'https://example.com', + description: 'Navigate to homepage', + }], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + + it('displays step with stepId', function () { + const test = getMockTest({ + steps: [{ + goTo: 'https://example.com', + stepId: 'step-1', + }], + }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('goTo'); + }); + }); + + describe('empty test handling', function () { + it('handles test with no steps', function () { + const test = getMockTest({ steps: [] }); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps (0)'); + expect(frame).to.include('Add step'); + }); + + it('handles test with undefined steps', function () { + const test = { testId: 'test-1' }; // No steps property + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Steps (0)'); + }); + + it('handles test with minimal properties', function () { + const test = { testId: 'minimal-test' }; + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Edit Test'); + expect(frame).to.include('testId'); + }); + }); + + describe('status bar display', function () { + it('displays test number in status bar', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test 1'); + }); + + it('displays different test numbers correctly', function () { + const test = getMockTest(); + const { lastFrame } = render( + React.createElement(TestEditor, { + test, + testIndex: 4, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Test 5'); + }); + }); +}); diff --git a/cli/test/builder/editor.test.mjs b/cli/test/builder/editor.test.mjs index 83739a8..7e6a565 100644 --- a/cli/test/builder/editor.test.mjs +++ b/cli/test/builder/editor.test.mjs @@ -95,10 +95,10 @@ describe('CLI Editor Integration', function() { it('should recognize --editor flag', async () => { // Create a valid spec file const specContent = { - id: 'test-spec', + specId: 'test-spec', tests: [{ - id: 'test-1', - steps: [{ action: 'wait', duration: 100 }] + testId: 'test-1', + steps: [{ wait: 100 }] }] }; const specPath = createTestSpecFile(tempDir, 'test.spec.json', specContent); @@ -118,10 +118,10 @@ describe('CLI Editor Integration', function() { it('should recognize -e short flag', async () => { const specContent = { - id: 'test-spec', + specId: 'test-spec', tests: [{ - id: 'test-1', - steps: [{ action: 'wait', duration: 100 }] + testId: 'test-1', + steps: [{ wait: 100 }] }] }; const specPath = createTestSpecFile(tempDir, 'test.spec.json', specContent); @@ -139,10 +139,10 @@ describe('CLI Editor Integration', function() { describe('input file handling', () => { it('should accept --input flag with spec file', async () => { const specContent = { - id: 'input-test-spec', + specId: 'input-test-spec', tests: [{ - id: 'test-1', - steps: [{ action: 'wait', duration: 100 }] + testId: 'test-1', + steps: [{ wait: 100 }] }] }; const specPath = createTestSpecFile(tempDir, 'input-test.spec.json', specContent); @@ -158,10 +158,10 @@ describe('CLI Editor Integration', function() { it('should accept -i short flag with spec file', async () => { const specContent = { - id: 'short-flag-test', + specId: 'short-flag-test', tests: [{ - id: 'test-1', - steps: [{ action: 'wait', duration: 100 }] + testId: 'test-1', + steps: [{ wait: 100 }] }] }; const specPath = createTestSpecFile(tempDir, 'short-flag.spec.json', specContent); @@ -176,10 +176,10 @@ describe('CLI Editor Integration', function() { it('should accept --input=value format', async () => { const specContent = { - id: 'equals-format-test', + specId: 'equals-format-test', tests: [{ - id: 'test-1', - steps: [{ action: 'wait', duration: 100 }] + testId: 'test-1', + steps: [{ wait: 100 }] }] }; const specPath = createTestSpecFile(tempDir, 'equals-format.spec.json', specContent); @@ -208,17 +208,17 @@ describe('CLI Editor Integration', function() { it('should accept comma-separated input paths', async () => { const spec1Content = { - id: 'multi-input-1', + specId: 'multi-input-1', tests: [{ - id: 'test-1', - steps: [{ action: 'wait', duration: 100 }] + testId: 'test-1', + steps: [{ wait: 100 }] }] }; const spec2Content = { - id: 'multi-input-2', + specId: 'multi-input-2', tests: [{ - id: 'test-2', - steps: [{ action: 'wait', duration: 100 }] + testId: 'test-2', + steps: [{ wait: 100 }] }] }; const specPath1 = createTestSpecFile(tempDir, 'multi1.spec.json', spec1Content); @@ -261,10 +261,10 @@ tests: describe('positional arguments', () => { it('should accept spec file path as positional argument', async () => { const specContent = { - id: 'positional-test', + specId: 'positional-test', tests: [{ - id: 'test-1', - steps: [{ action: 'wait', duration: 100 }] + testId: 'test-1', + steps: [{ wait: 100 }] }] }; const specPath = createTestSpecFile(tempDir, 'positional.spec.json', specContent); @@ -278,4 +278,175 @@ tests: expect(result.stderr).to.not.include('SyntaxError'); }); }); + + describe('markdown file support', () => { + it('should accept markdown files with inline tests', async () => { + const markdownContent = `# Test Documentation + +This is a test document with inline tests. + + + + +More documentation content. +`; + const mdPath = path.join(tempDir, 'doc-with-tests.md'); + fs.writeFileSync(mdPath, markdownContent); + + const result = await spawnWithTimeout(['--editor', '-i', mdPath], { + timeout: 3000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('output handling', () => { + it('should not produce JavaScript errors on startup', async () => { + const specContent = { + id: 'startup-test', + tests: [{ + id: 'test-1', + steps: [{ goTo: 'https://example.com' }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'startup.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('ReferenceError'); + expect(result.stderr).to.not.include('TypeError'); + expect(result.stderr).to.not.include('Cannot find module'); + }); + }); + + describe('complex spec files', () => { + it('should handle spec with multiple tests', async () => { + const specContent = { + specId: 'multi-test-spec', + tests: [ + { + testId: 'test-1', + description: 'First test', + steps: [{ goTo: 'https://example.com/page1' }] + }, + { + testId: 'test-2', + description: 'Second test', + steps: [ + { goTo: 'https://example.com/page2' }, + { click: '.button' } + ] + }, + { + testId: 'test-3', + description: 'Third test', + steps: [ + { goTo: 'https://example.com/page3' }, + { find: '.element' }, + { screenshot: 'result.png' } + ] + } + ] + }; + const specPath = createTestSpecFile(tempDir, 'multi-test.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + expect(result.stderr).to.not.include('Error:'); + }); + + it('should handle spec with all step types', async () => { + const specContent = { + specId: 'all-steps-spec', + tests: [{ + testId: 'test-1', + steps: [ + { goTo: 'https://example.com' }, + { click: '.button' }, + { find: '.element' }, + { type: ['test input', '$ENTER$'] }, + { screenshot: 'screenshot.png' }, + { wait: 1000 }, + { httpRequest: { url: 'https://api.example.com', method: 'GET' } }, + { runShell: 'echo test' } + ] + }] + }; + const specPath = createTestSpecFile(tempDir, 'all-steps.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); + + describe('invalid spec handling', () => { + it('should handle spec with validation errors gracefully', async () => { + // Spec with invalid structure but parseable JSON + const specContent = { + id: 'invalid-spec', + tests: 'this should be an array' + }; + const specPath = createTestSpecFile(tempDir, 'invalid.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 3000, + cwd: tempDir, + }); + + // Should not crash with JavaScript errors + expect(result.stderr).to.not.include('TypeError'); + expect(result.stderr).to.not.include('Cannot read properties'); + }); + + it('should error on unparseable JSON', async () => { + const invalidJson = '{ this is not valid json }'; + const jsonPath = path.join(tempDir, 'broken.spec.json'); + fs.writeFileSync(jsonPath, invalidJson); + + const result = await spawnWithTimeout(['--editor', '-i', jsonPath], { + timeout: 3000, + cwd: tempDir, + }); + + // Should report the file couldn't be parsed + expect(result.stderr).to.include('No valid spec files'); + }); + }); + + describe('environment handling', () => { + it('should work without any environment variables', async () => { + const specContent = { + id: 'env-test', + tests: [{ + id: 'test-1', + steps: [{ goTo: 'https://example.com' }] + }] + }; + const specPath = createTestSpecFile(tempDir, 'env-test.spec.json', specContent); + + const result = await spawnWithTimeout(['--editor', '-i', specPath], { + timeout: 2000, + cwd: tempDir, + env: { + PATH: process.env.PATH, + NODE_PATH: process.env.NODE_PATH, + }, + }); + + expect(result.stderr).to.not.include('SyntaxError'); + }); + }); }); From 4bfed86c55a5fb31e30ea10c27fa29dd9d3cdd78 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Sat, 6 Dec 2025 13:35:30 -0800 Subject: [PATCH 16/90] simplifi3d runner --- cli/src/cli/App.js | 49 --------- cli/src/cli/App.mjs | 39 +++++++ cli/src/cli/ResultsSummary.js | 182 --------------------------------- cli/src/cli/ResultsSummary.mjs | 162 +++++++++++++++++++++++++++++ cli/src/cli/TestRunner.js | 54 ---------- cli/src/cli/TestRunner.mjs | 41 ++++++++ cli/src/cli/runner.js | 10 +- cli/src/index.js | 12 +-- 8 files changed, 255 insertions(+), 294 deletions(-) delete mode 100644 cli/src/cli/App.js create mode 100644 cli/src/cli/App.mjs delete mode 100644 cli/src/cli/ResultsSummary.js create mode 100644 cli/src/cli/ResultsSummary.mjs delete mode 100644 cli/src/cli/TestRunner.js create mode 100644 cli/src/cli/TestRunner.mjs diff --git a/cli/src/cli/App.js b/cli/src/cli/App.js deleted file mode 100644 index 4358c51..0000000 --- a/cli/src/cli/App.js +++ /dev/null @@ -1,49 +0,0 @@ -const React = require('react'); -const { Box, Text } = require('ink'); -const Spinner = require('ink-spinner').default; -const TestRunner = require('./TestRunner'); -const ResultsSummary = require('./ResultsSummary'); - -const App = ({ config, resolvedTests, state }) => { - return ( - - - - Doc Detective - - - - {state.phase === 'initializing' && ( - - - Initializing... - - - )} - - {state.phase === 'running' && ( - - )} - - {state.phase === 'completed' && state.results && ( - - )} - - {state.phase === 'error' && ( - - - ✖ Error - - {state.error} - - )} - - ); -}; - -module.exports = App; diff --git a/cli/src/cli/App.mjs b/cli/src/cli/App.mjs new file mode 100644 index 0000000..a6f6fbe --- /dev/null +++ b/cli/src/cli/App.mjs @@ -0,0 +1,39 @@ +import React from 'react'; +const { createElement: h } = React; +import { Box, Text } from 'ink'; +import Spinner from 'ink-spinner'; +import TestRunner from './TestRunner.mjs'; +import ResultsSummary from './ResultsSummary.mjs'; + +const App = ({ config, resolvedTests, state }) => { + return h(Box, { flexDirection: 'column', paddingY: 1 }, + h(Box, { marginBottom: 1 }, + h(Text, { bold: true, color: 'cyan' }, 'Doc Detective') + ), + + state.phase === 'initializing' && h(Box, null, + h(Text, { color: 'gray' }, + h(Spinner, { type: 'dots' }), ' Initializing...' + ) + ), + + state.phase === 'running' && h(TestRunner, { + config, + progress: state.progress, + currentSpec: state.currentSpec, + currentTest: state.currentTest, + }), + + state.phase === 'completed' && state.results && h(ResultsSummary, { + results: state.results, + config, + }), + + state.phase === 'error' && h(Box, { flexDirection: 'column' }, + h(Text, { color: 'red', bold: true }, '✖ Error'), + h(Text, { color: 'red' }, state.error) + ) + ); +}; + +export default App; diff --git a/cli/src/cli/ResultsSummary.js b/cli/src/cli/ResultsSummary.js deleted file mode 100644 index 9941dd9..0000000 --- a/cli/src/cli/ResultsSummary.js +++ /dev/null @@ -1,182 +0,0 @@ -const React = require('react'); -const { Box, Text } = require('ink'); - -const ResultsSummary = ({ results, config }) => { - if (!results || !results.summary) { - return ( - - No results available. - - ); - } - - const { specs, tests, contexts, steps } = results.summary; - - // Calculate totals - const totalSpecs = specs ? specs.pass + specs.fail + specs.warning + specs.skipped : 0; - const totalTests = tests ? tests.pass + tests.fail + tests.warning + tests.skipped : 0; - const totalContexts = contexts ? contexts.pass + contexts.fail + contexts.warning + contexts.skipped : 0; - const totalSteps = steps ? steps.pass + steps.fail + steps.warning + steps.skipped : 0; - - // Check for failures - const hasFailures = - (specs && specs.fail > 0) || - (tests && tests.fail > 0) || - (contexts && contexts.fail > 0) || - (steps && steps.fail > 0); - - // Check if all skipped - const allSpecsSkipped = - specs && specs.pass === 0 && specs.fail === 0 && specs.skipped > 0; - - return ( - - {/* Header */} - - - Test Results Summary - - - - {/* Summary sections */} - {specs && ( - - Specs - - Total: {totalSpecs} - {specs.pass > 0 && ✓ {specs.pass} passed } - {specs.fail > 0 && ✖ {specs.fail} failed } - {specs.warning > 0 && ⚠ {specs.warning} warnings } - {specs.skipped > 0 && ⊘ {specs.skipped} skipped} - - - )} - - {tests && ( - - Tests - - Total: {totalTests} - {tests.pass > 0 && ✓ {tests.pass} passed } - {tests.fail > 0 && ✖ {tests.fail} failed } - {tests.warning > 0 && ⚠ {tests.warning} warnings } - {tests.skipped > 0 && ⊘ {tests.skipped} skipped} - - - )} - - {contexts && ( - - Contexts - - Total: {totalContexts} - {contexts.pass > 0 && ✓ {contexts.pass} passed } - {contexts.fail > 0 && ✖ {contexts.fail} failed } - {contexts.warning > 0 && ⚠ {contexts.warning} warnings } - {contexts.skipped > 0 && ⊘ {contexts.skipped} skipped} - - - )} - - {steps && ( - - Steps - - Total: {totalSteps} - {steps.pass > 0 && ✓ {steps.pass} passed } - {steps.fail > 0 && ✖ {steps.fail} failed } - {steps.warning > 0 && ⚠ {steps.warning} warnings } - {steps.skipped > 0 && ⊘ {steps.skipped} skipped} - - - )} - - {/* Overall status */} - - {allSpecsSkipped ? ( - ⚠ All items were skipped - ) : hasFailures ? ( - - ✖ Tests failed - - ) : ( - - ✓ All tests passed! - - )} - - - {/* Failed items detail */} - {hasFailures && results.specs && ( - - - Failed Items: - - {getFailedItems(results).map((item, index) => ( - - - • {item} - - - ))} - - )} - - ); -}; - -// Helper function to extract failed items -function getFailedItems(results) { - const failures = []; - - if (!results.specs) return failures; - - results.specs.forEach((spec, specIndex) => { - if (spec.result === 'FAIL') { - failures.push(`Spec: ${spec.specId || `Spec ${specIndex + 1}`}`); - } - - if (spec.tests && spec.tests.length > 0) { - spec.tests.forEach((test, testIndex) => { - if (test.result === 'FAIL') { - failures.push( - `Test: ${test.testId || `Test ${testIndex + 1}`} (from ${ - spec.specId || `Spec ${specIndex + 1}` - })` - ); - } - - if (test.contexts && test.contexts.length > 0) { - test.contexts.forEach((context, contextIndex) => { - if ( - context.result === 'FAIL' || - (context.result && context.result.status === 'FAIL') - ) { - failures.push( - `Context: ${context.platform || 'unknown'}/${ - context.browser ? context.browser.name : 'unknown' - } (from ${test.testId || `Test ${testIndex + 1}`})` - ); - } - - if (context.steps && context.steps.length > 0) { - context.steps.forEach((step, stepIndex) => { - if (step.result === 'FAIL') { - failures.push( - `Step: ${step.stepId || `Step ${stepIndex + 1}`} - ${ - step.resultDescription || 'Unknown error' - }` - ); - } - }); - } - }); - } - }); - } - }); - - return failures; -} - -module.exports = ResultsSummary; diff --git a/cli/src/cli/ResultsSummary.mjs b/cli/src/cli/ResultsSummary.mjs new file mode 100644 index 0000000..f2086f5 --- /dev/null +++ b/cli/src/cli/ResultsSummary.mjs @@ -0,0 +1,162 @@ +import React from 'react'; +const { createElement: h } = React; +import { Box, Text } from 'ink'; + +const ResultsSummary = ({ results, config }) => { + if (!results || !results.summary) { + return h(Box, null, + h(Text, { color: 'yellow' }, 'No results available.') + ); + } + + const { specs, tests, contexts, steps } = results.summary; + + // Calculate totals + const totalSpecs = specs ? specs.pass + specs.fail + specs.warning + specs.skipped : 0; + const totalTests = tests ? tests.pass + tests.fail + tests.warning + tests.skipped : 0; + const totalContexts = contexts ? contexts.pass + contexts.fail + contexts.warning + contexts.skipped : 0; + const totalSteps = steps ? steps.pass + steps.fail + steps.warning + specs.skipped : 0; + + // Check for failures + const hasFailures = + (specs && specs.fail > 0) || + (tests && tests.fail > 0) || + (contexts && contexts.fail > 0) || + (steps && steps.fail > 0); + + // Check if all skipped + const allSpecsSkipped = + specs && specs.pass === 0 && specs.fail === 0 && specs.skipped > 0; + + const failedItems = hasFailures && results.specs ? getFailedItems(results) : []; + + return h(Box, { flexDirection: 'column' }, + // Header + h(Box, { marginBottom: 1 }, + h(Text, { bold: true, underline: true }, 'Test Results Summary') + ), + + // Specs summary + specs && h(Box, { flexDirection: 'column', marginBottom: 1 }, + h(Text, { bold: true }, 'Specs'), + h(Box, { marginLeft: 2 }, + h(Text, null, `Total: ${totalSpecs} `), + specs.pass > 0 && h(Text, { color: 'green' }, `✓ ${specs.pass} passed `), + specs.fail > 0 && h(Text, { color: 'red' }, `✖ ${specs.fail} failed `), + specs.warning > 0 && h(Text, { color: 'yellow' }, `⚠ ${specs.warning} warnings `), + specs.skipped > 0 && h(Text, { color: 'gray' }, `⊘ ${specs.skipped} skipped`) + ) + ), + + // Tests summary + tests && h(Box, { flexDirection: 'column', marginBottom: 1 }, + h(Text, { bold: true }, 'Tests'), + h(Box, { marginLeft: 2 }, + h(Text, null, `Total: ${totalTests} `), + tests.pass > 0 && h(Text, { color: 'green' }, `✓ ${tests.pass} passed `), + tests.fail > 0 && h(Text, { color: 'red' }, `✖ ${tests.fail} failed `), + tests.warning > 0 && h(Text, { color: 'yellow' }, `⚠ ${tests.warning} warnings `), + tests.skipped > 0 && h(Text, { color: 'gray' }, `⊘ ${tests.skipped} skipped`) + ) + ), + + // Contexts summary + contexts && h(Box, { flexDirection: 'column', marginBottom: 1 }, + h(Text, { bold: true }, 'Contexts'), + h(Box, { marginLeft: 2 }, + h(Text, null, `Total: ${totalContexts} `), + contexts.pass > 0 && h(Text, { color: 'green' }, `✓ ${contexts.pass} passed `), + contexts.fail > 0 && h(Text, { color: 'red' }, `✖ ${contexts.fail} failed `), + contexts.warning > 0 && h(Text, { color: 'yellow' }, `⚠ ${contexts.warning} warnings `), + contexts.skipped > 0 && h(Text, { color: 'gray' }, `⊘ ${contexts.skipped} skipped`) + ) + ), + + // Steps summary + steps && h(Box, { flexDirection: 'column', marginBottom: 1 }, + h(Text, { bold: true }, 'Steps'), + h(Box, { marginLeft: 2 }, + h(Text, null, `Total: ${totalSteps} `), + steps.pass > 0 && h(Text, { color: 'green' }, `✓ ${steps.pass} passed `), + steps.fail > 0 && h(Text, { color: 'red' }, `✖ ${steps.fail} failed `), + steps.warning > 0 && h(Text, { color: 'yellow' }, `⚠ ${steps.warning} warnings `), + steps.skipped > 0 && h(Text, { color: 'gray' }, `⊘ ${steps.skipped} skipped`) + ) + ), + + // Overall status + h(Box, { marginTop: 1 }, + allSpecsSkipped + ? h(Text, { color: 'yellow' }, '⚠ All items were skipped') + : hasFailures + ? h(Text, { color: 'red', bold: true }, '✖ Tests failed') + : h(Text, { color: 'green', bold: true }, '✓ All tests passed!') + ), + + // Failed items detail + hasFailures && results.specs && h(Box, { flexDirection: 'column', marginTop: 1 }, + h(Text, { bold: true, color: 'red' }, 'Failed Items:'), + ...failedItems.map((item, index) => + h(Box, { key: index, marginLeft: 2 }, + h(Text, { color: 'red' }, `• ${item}`) + ) + ) + ) + ); +}; + +// Helper function to extract failed items +function getFailedItems(results) { + const failures = []; + + if (!results.specs) return failures; + + results.specs.forEach((spec, specIndex) => { + if (spec.result === 'FAIL') { + failures.push(`Spec: ${spec.specId || `Spec ${specIndex + 1}`}`); + } + + if (spec.tests && spec.tests.length > 0) { + spec.tests.forEach((test, testIndex) => { + if (test.result === 'FAIL') { + failures.push( + `Test: ${test.testId || `Test ${testIndex + 1}`} (from ${ + spec.specId || `Spec ${specIndex + 1}` + })` + ); + } + + if (test.contexts && test.contexts.length > 0) { + test.contexts.forEach((context, contextIndex) => { + if ( + context.result === 'FAIL' || + (context.result && context.result.status === 'FAIL') + ) { + failures.push( + `Context: ${context.platform || 'unknown'}/${ + context.browser ? context.browser.name : 'unknown' + } (from ${test.testId || `Test ${testIndex + 1}`})` + ); + } + + if (context.steps && context.steps.length > 0) { + context.steps.forEach((step, stepIndex) => { + if (step.result === 'FAIL') { + failures.push( + `Step: ${step.stepId || `Step ${stepIndex + 1}`} - ${ + step.resultDescription || 'Unknown error' + }` + ); + } + }); + } + }); + } + }); + } + }); + + return failures; +} + +export default ResultsSummary; diff --git a/cli/src/cli/TestRunner.js b/cli/src/cli/TestRunner.js deleted file mode 100644 index 97f3214..0000000 --- a/cli/src/cli/TestRunner.js +++ /dev/null @@ -1,54 +0,0 @@ -const React = require('react'); -const { Box, Text } = require('ink'); -const Spinner = require('ink-spinner').default; - -const TestRunner = ({ config, progress, currentSpec, currentTest }) => { - return ( - - - - Running tests... - - - - {/* Progress bars */} - {progress.specs.total > 0 && ( - - - Specs: {progress.specs.current}/{progress.specs.total} - - - )} - - {progress.tests.total > 0 && ( - - - Tests: {progress.tests.current}/{progress.tests.total} - - - )} - - {progress.steps.total > 0 && ( - - - Steps: {progress.steps.current}/{progress.steps.total} - - - )} - - {/* Current execution context */} - {currentSpec && ( - - Current: {currentSpec} - {currentTest && ( - - → {currentTest} - - )} - - )} - - ); -}; - -module.exports = TestRunner; diff --git a/cli/src/cli/TestRunner.mjs b/cli/src/cli/TestRunner.mjs new file mode 100644 index 0000000..a8ed751 --- /dev/null +++ b/cli/src/cli/TestRunner.mjs @@ -0,0 +1,41 @@ +import React from 'react'; +const { createElement: h } = React; +import { Box, Text } from 'ink'; +import Spinner from 'ink-spinner'; + +const TestRunner = ({ config, progress, currentSpec, currentTest }) => { + return h(Box, { flexDirection: 'column' }, + h(Box, { marginBottom: 1 }, + h(Text, { color: 'yellow' }, + h(Spinner, { type: 'dots' }), ' Running tests...' + ) + ), + + // Progress bars + progress.specs.total > 0 && h(Box, { marginBottom: 0 }, + h(Text, { color: 'gray' }, + `Specs: ${progress.specs.current}/${progress.specs.total}` + ) + ), + + progress.tests.total > 0 && h(Box, { marginBottom: 0 }, + h(Text, { color: 'gray' }, + `Tests: ${progress.tests.current}/${progress.tests.total}` + ) + ), + + progress.steps.total > 0 && h(Box, { marginBottom: 1 }, + h(Text, { color: 'gray' }, + `Steps: ${progress.steps.current}/${progress.steps.total}` + ) + ), + + // Current execution context + currentSpec && h(Box, { flexDirection: 'column', marginTop: 1 }, + h(Text, { color: 'cyan' }, `Current: ${currentSpec}`), + currentTest && h(Text, { color: 'gray', dimColor: true }, `→ ${currentTest}`) + ) + ); +}; + +export default TestRunner; diff --git a/cli/src/cli/runner.js b/cli/src/cli/runner.js index 09f1cc9..161c05c 100644 --- a/cli/src/cli/runner.js +++ b/cli/src/cli/runner.js @@ -1,6 +1,3 @@ -const { render } = require('ink'); -const React = require('react'); -const App = require('./App'); const { runTests } = require('doc-detective-core'); /** @@ -10,6 +7,13 @@ const { runTests } = require('doc-detective-core'); * @returns {Promise} Test results */ async function runWithUI(config, options = {}) { + // Dynamic import of ESM modules + const [{ render }, React, { default: App }] = await Promise.all([ + import('ink'), + import('react'), + import('./App.mjs'), + ]); + let appInstance; let updateState; diff --git a/cli/src/index.js b/cli/src/index.js index aa3e381..197f1e2 100755 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -175,19 +175,19 @@ async function main(argv) { let resolvedTests = api?.resolvedTests || null; let apiConfig = api?.apiConfig || null; - // Run tests with the new Ink-based UI - // Dynamically import to avoid ESM issues at startup - const { runWithUI } = require("./cli/runner"); + // Run tests directly using doc-detective-core + const { runTests } = require("doc-detective-core"); const output = config.output; - const results = await runWithUI(config, { resolvedTests }); + const results = resolvedTests + ? await runTests(config, { resolvedTests }) + : await runTests(config); if (apiConfig) { await reportResults({ apiConfig, results }); } else { - // Output results to JSON file only (terminal output is handled by Ink UI) + // Output results await outputResults(config, output, results, { command: "runTests", - reporters: ["json"] // Only use JSON reporter, not terminal reporter }); } } From 4def00dfca038ab5074e0f31f6e4006f2bc86622 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Sun, 7 Dec 2025 08:11:31 -0800 Subject: [PATCH 17/90] test fixes --- cli/package.json | 2 +- cli/test/builder/schemaUtils.test.mjs | 9 +- cli/test/builder/sourceFileUtils.test.mjs | 27 +- core/package-lock.json | 694 ++++------------------ 4 files changed, 123 insertions(+), 609 deletions(-) diff --git a/cli/package.json b/cli/package.json index ccf9b35..6ce7c60 100644 --- a/cli/package.json +++ b/cli/package.json @@ -8,7 +8,7 @@ "main": "./src/index.js", "scripts": { "mocha": "mocha", - "test": "mocha test/*.test.js test/builder/*.test.mjs", + "test": "mocha --exit test/*.test.js test/builder/*.test.mjs", "prerunTests": "node ./src/checkDependencies.js", "runTests": "node ./src/index.js runTests", "start": "node ./src/index.js", diff --git a/cli/test/builder/schemaUtils.test.mjs b/cli/test/builder/schemaUtils.test.mjs index 9bc488e..f018ef7 100644 --- a/cli/test/builder/schemaUtils.test.mjs +++ b/cli/test/builder/schemaUtils.test.mjs @@ -76,7 +76,7 @@ describe('schemaUtils', function () { const schema = getStepTypeSchema('goTo'); expect(schema).to.be.an('object'); - expect(schema).to.have.property('anyOf').or.have.property('type'); + expect(schema.anyOf !== undefined || schema.type !== undefined).to.be.true; }); it('returns null for invalid step type', function () { @@ -88,7 +88,7 @@ describe('schemaUtils', function () { it('returns schemas with descriptions', function () { const schema = getStepTypeSchema('click'); - expect(schema).to.have.property('description').or.have.property('title'); + expect(schema.description !== undefined || schema.title !== undefined).to.be.true; }); }); @@ -327,10 +327,11 @@ describe('schemaUtils', function () { }); it('validates an empty spec', function () { - const spec = getMockSpec(); + // A spec with empty steps array is invalid per schema (minItems: 1 on steps) + const spec = getMockSpec({ tests: [{ steps: [] }] }); const result = validateSpec(spec); - expect(result.valid).to.be.true; + expect(result.valid).to.be.false; }); it('returns validation errors for invalid spec', function () { diff --git a/cli/test/builder/sourceFileUtils.test.mjs b/cli/test/builder/sourceFileUtils.test.mjs index c1f2775..83e7389 100644 --- a/cli/test/builder/sourceFileUtils.test.mjs +++ b/cli/test/builder/sourceFileUtils.test.mjs @@ -755,9 +755,10 @@ describe('sourceFileUtils', function () { }); it('skips unmodified inline steps', function () { - const spec = getMockSpec({ + // Use test without metadata (testId/description) to avoid triggering test declaration insertion + const originalSpec = getMockSpec({ tests: [ - getMockTest({ + { steps: [ getMockInlineStep('goTo', 'https://example.com', { file: '/path/to/file.md', @@ -765,20 +766,24 @@ describe('sourceFileUtils', function () { endOffset: 50, }), ], - }), + }, ], }); - // Same spec as original - no modifications - const updates = prepareSourceUpdates({ spec, originalSpec: spec }); + // Create a deep clone with identical content + const spec = JSON.parse(JSON.stringify(originalSpec)); + + // Same content as original - no modifications + const updates = prepareSourceUpdates({ spec, originalSpec }); expect(updates.size).to.equal(0); }); it('handles auto-detected steps with insertLineAfter', function () { + // Use test without metadata (testId/description) to avoid triggering test declaration insertion const originalSpec = getMockSpec({ tests: [ - getMockTest({ + { steps: [ getMockInlineStep('goTo', 'https://old.com', { file: '/path/to/file.md', @@ -787,13 +792,13 @@ describe('sourceFileUtils', function () { isAutoDetected: true, }), ], - }), + }, ], }); const modifiedSpec = getMockSpec({ tests: [ - getMockTest({ + { steps: [ getMockInlineStep('goTo', 'https://new.com', { file: '/path/to/file.md', @@ -802,7 +807,7 @@ describe('sourceFileUtils', function () { isAutoDetected: true, }), ], - }), + }, ], }); @@ -810,7 +815,9 @@ describe('sourceFileUtils', function () { expect(updates.size).to.equal(1); const fileUpdates = updates.get('/path/to/file.md'); - expect(fileUpdates[0].insertLineAfter).to.be.true; + expect(fileUpdates).to.be.an('array'); + expect(fileUpdates.length).to.be.greaterThan(0); + expect(fileUpdates[0]).to.have.property('insertLineAfter', true); }); }); }); diff --git a/core/package-lock.json b/core/package-lock.json index c71e9d8..0b3709f 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1765,6 +1765,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1847,6 +1848,7 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -6728,7 +6730,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -6763,7 +6764,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -6778,7 +6778,6 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -6808,7 +6807,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -6982,7 +6980,6 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -7509,7 +7506,6 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -7525,7 +7521,6 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -7547,8 +7542,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/@xmldom/xmldom": { "version": "0.8.11", @@ -7576,7 +7570,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -7590,7 +7583,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -7636,7 +7628,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -7703,7 +7694,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -7836,8 +7826,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/appium-geckodriver/node_modules/async": { "version": "3.2.6", @@ -7947,7 +7936,6 @@ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -7969,7 +7957,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7981,7 +7968,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8002,7 +7988,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -8058,7 +8043,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8084,7 +8068,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8107,7 +8090,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -8152,7 +8134,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -8165,7 +8146,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -8178,7 +8158,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -8193,7 +8172,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8205,15 +8183,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -8231,7 +8207,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -8249,7 +8224,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -8259,7 +8233,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -8291,7 +8264,6 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -8304,7 +8276,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -8314,7 +8285,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -8327,7 +8297,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -8349,7 +8318,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -8375,7 +8343,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -8391,7 +8358,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8405,7 +8371,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8415,7 +8380,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8425,7 +8389,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.6.0" } @@ -8501,7 +8464,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -8519,7 +8481,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -8541,7 +8502,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8561,15 +8521,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -8604,8 +8562,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/emoji-regex": { "version": "9.2.2", @@ -8617,15 +8574,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8689,7 +8644,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -8698,15 +8652,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8743,7 +8695,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -8816,7 +8767,6 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -8825,15 +8775,13 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -8870,8 +8818,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/follow-redirects": { "version": "1.15.11", @@ -8963,7 +8910,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8973,7 +8919,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9027,7 +8972,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -9037,7 +8981,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -9155,8 +9098,7 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/has-flag": { "version": "4.0.0", @@ -9218,7 +9160,6 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9231,8 +9172,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -9240,7 +9180,6 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9257,7 +9196,6 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -9267,15 +9205,13 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -9295,15 +9231,13 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9351,7 +9285,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -9391,7 +9324,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9409,8 +9341,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/is-stream": { "version": "2.0.1", @@ -9525,7 +9456,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9534,8 +9464,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/lazystream": { "version": "1.0.1", @@ -9584,7 +9513,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14" }, @@ -9655,7 +9583,6 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -9691,7 +9618,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9701,7 +9627,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -9714,7 +9639,6 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -9730,7 +9654,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9739,15 +9662,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9757,7 +9678,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9767,7 +9687,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -9784,7 +9703,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9794,8 +9712,7 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/minipass": { "version": "7.1.2", @@ -9820,7 +9737,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -9837,7 +9753,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9846,15 +9761,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9882,7 +9795,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9922,7 +9834,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -9935,15 +9846,13 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9956,7 +9865,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9975,7 +9883,6 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", - "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -9985,7 +9892,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -10001,7 +9907,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -10025,7 +9930,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10035,7 +9939,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10078,7 +9981,6 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", - "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -10123,7 +10025,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -10173,7 +10074,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -10269,7 +10169,6 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -10289,7 +10188,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -10305,7 +10203,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10315,7 +10212,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -10331,7 +10227,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -10481,7 +10376,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -10495,7 +10389,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -10518,7 +10411,6 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -10527,8 +10419,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/sanitize-filename": { "version": "1.6.3", @@ -10544,8 +10435,7 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/semver": { "version": "7.7.3", @@ -10564,7 +10454,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -10587,7 +10476,6 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", - "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -10604,7 +10492,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10627,15 +10514,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -10656,8 +10541,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-geckodriver/node_modules/sharp": { "version": "0.34.5", @@ -10742,7 +10626,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -10762,7 +10645,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -10779,7 +10661,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10798,7 +10679,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10876,7 +10756,6 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -10894,7 +10773,6 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -10910,7 +10788,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10925,7 +10802,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -10935,7 +10811,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11174,8 +11049,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/through": { "version": "2.3.8", @@ -11188,7 +11062,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -11198,7 +11071,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -11239,7 +11111,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", - "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -11263,7 +11134,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11308,7 +11178,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11319,7 +11188,6 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -11329,7 +11197,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -11354,7 +11221,6 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -11377,7 +11243,6 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -11392,7 +11257,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11407,7 +11271,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11422,7 +11285,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11499,7 +11361,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -11508,15 +11369,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11531,7 +11390,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11550,7 +11408,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -11581,7 +11438,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -11591,7 +11447,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -11604,7 +11459,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -11622,7 +11476,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -11631,15 +11484,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -11728,7 +11579,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -11763,7 +11613,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -11778,7 +11627,6 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -11808,7 +11656,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11841,7 +11688,6 @@ "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" @@ -11856,7 +11702,6 @@ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/tsconfig": "^1.1.0", @@ -11907,7 +11752,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11924,7 +11768,6 @@ "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@tsconfig/node20": "20.1.6" }, @@ -11938,7 +11781,6 @@ "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/schema": "^1.0.0", @@ -11955,7 +11797,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -11970,7 +11811,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -11980,7 +11820,6 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.1.90" } @@ -11990,7 +11829,6 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -12013,7 +11851,6 @@ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=18" } @@ -12030,7 +11867,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -12053,7 +11889,6 @@ "os": [ "darwin" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -12084,7 +11919,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -12102,7 +11936,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12115,7 +11948,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -12134,7 +11966,6 @@ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=14" } @@ -12144,7 +11975,6 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -12160,7 +11990,6 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -12170,29 +11999,25 @@ "version": "20.1.6", "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@xmldom/xmldom": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -12202,7 +12027,6 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", - "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -12215,7 +12039,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -12229,7 +12052,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -12247,7 +12069,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12260,7 +12081,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12277,7 +12097,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -12322,7 +12141,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -12339,7 +12157,6 @@ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", @@ -12358,7 +12175,6 @@ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "license": "MIT", - "peer": true, "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", @@ -12377,7 +12193,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -12387,7 +12202,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -12408,7 +12222,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -12423,15 +12236,13 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12447,7 +12258,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -12463,22 +12273,19 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/appium-safari-driver/node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/async-lock": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/asyncbox": { "version": "3.0.0", @@ -12498,15 +12305,13 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/axios": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", - "peer": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -12518,7 +12323,6 @@ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "react-native-b4a": "*" }, @@ -12532,15 +12336,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/bare-events": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "bare-abort-controller": "*" }, @@ -12568,22 +12370,19 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/base64-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -12596,7 +12395,6 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -12606,7 +12404,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -12618,7 +12415,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12639,7 +12435,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -12660,7 +12455,6 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -12670,7 +12464,6 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -12697,7 +12490,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12708,7 +12500,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -12724,7 +12515,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -12734,7 +12524,6 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -12748,7 +12537,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -12765,7 +12553,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12782,7 +12569,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12795,7 +12581,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -12808,7 +12593,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -12821,7 +12605,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -12836,7 +12619,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12848,15 +12630,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -12874,7 +12654,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -12892,7 +12671,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -12902,7 +12680,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -12916,7 +12693,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12928,15 +12704,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/color-string": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12949,7 +12723,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12959,7 +12732,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12972,7 +12744,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12982,7 +12753,6 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", - "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -12995,7 +12765,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -13005,7 +12774,6 @@ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", @@ -13022,7 +12790,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -13038,7 +12805,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -13052,7 +12818,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13062,7 +12827,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13072,7 +12836,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.6.0" } @@ -13081,15 +12844,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "license": "Apache-2.0", - "peer": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -13102,7 +12863,6 @@ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" @@ -13116,7 +12876,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -13130,15 +12889,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -13154,7 +12911,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -13172,7 +12928,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -13185,7 +12940,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -13195,7 +12949,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13206,7 +12959,6 @@ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -13216,15 +12968,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -13234,7 +12984,6 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -13248,43 +12997,37 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13294,7 +13037,6 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", - "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -13304,7 +13046,6 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -13314,7 +13055,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -13324,7 +13064,6 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -13337,7 +13076,6 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -13353,7 +13091,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -13362,15 +13099,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13380,7 +13115,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -13390,7 +13124,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -13400,7 +13133,6 @@ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bare-events": "^2.7.0" } @@ -13410,7 +13142,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -13459,8 +13190,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/fast-uri": { "version": "3.1.0", @@ -13484,7 +13214,6 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -13493,15 +13222,13 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -13523,7 +13250,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -13539,8 +13265,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/follow-redirects": { "version": "1.15.11", @@ -13553,7 +13278,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" }, @@ -13568,7 +13292,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -13585,7 +13308,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", - "peer": true, "engines": { "node": ">=14" }, @@ -13598,7 +13320,6 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -13615,7 +13336,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13625,7 +13345,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13638,7 +13357,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13648,7 +13366,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13657,7 +13374,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "peer": true, "dependencies": { "readable-stream": "^1.0.31" }, @@ -13669,15 +13385,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -13689,15 +13403,13 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13707,7 +13419,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -13717,7 +13428,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -13730,7 +13440,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -13755,7 +13464,6 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", - "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -13769,7 +13477,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -13782,7 +13489,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", @@ -13806,7 +13512,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -13822,7 +13527,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -13834,23 +13538,20 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -13860,7 +13561,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -13873,7 +13573,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", - "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -13889,7 +13588,6 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", - "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -13901,8 +13599,7 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/hpack.js": { "version": "2.1.6", @@ -13910,7 +13607,6 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -13923,8 +13619,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -13932,7 +13627,6 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13949,7 +13643,6 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13959,15 +13652,13 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -13987,15 +13678,13 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -14021,22 +13710,19 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/appium-safari-driver/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -14045,15 +13731,13 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", - "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -14069,7 +13753,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14079,7 +13762,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14097,15 +13779,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -14118,7 +13798,6 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -14140,7 +13819,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -14155,15 +13833,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/jsftp": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^3.1.0", "ftp-response-parser": "^1.0.1", @@ -14181,7 +13857,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -14190,15 +13865,13 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)", - "peer": true + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/appium-safari-driver/node_modules/json-schema-traverse": { "version": "1.0.0", @@ -14212,7 +13885,6 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14.14.0" } @@ -14222,7 +13894,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -14231,15 +13902,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -14251,15 +13920,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -14275,7 +13942,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -14285,7 +13951,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14" }, @@ -14297,15 +13962,13 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -14321,7 +13984,6 @@ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "license": "ISC", - "peer": true, "dependencies": { "signal-exit": "^3.0.2" } @@ -14343,7 +14005,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -14360,7 +14021,6 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -14387,7 +14047,6 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -14397,7 +14056,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14407,7 +14065,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -14420,7 +14077,6 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -14436,7 +14092,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14445,15 +14100,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14463,7 +14116,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14473,7 +14125,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -14490,7 +14141,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -14500,8 +14150,7 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/minipass": { "version": "7.1.2", @@ -14517,7 +14166,6 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -14527,7 +14175,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -14544,7 +14191,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14553,15 +14199,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14573,15 +14217,13 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "license": "MIT", - "peer": true, "bin": { "ncp": "bin/ncp" } @@ -14591,7 +14233,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14638,7 +14279,6 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14651,7 +14291,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver" } @@ -14661,7 +14300,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -14671,7 +14309,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -14684,15 +14321,13 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14705,7 +14340,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14715,7 +14349,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", - "peer": true, "dependencies": { "wrappy": "1" } @@ -14725,7 +14358,6 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", - "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -14735,7 +14367,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14751,7 +14382,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -14775,7 +14405,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14785,7 +14414,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -14798,7 +14426,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -14814,7 +14441,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -14830,7 +14456,6 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", - "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -14849,7 +14474,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14867,7 +14491,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "peer": true, "engines": { "node": ">=0.6.21" } @@ -14877,7 +14500,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14887,7 +14509,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14897,7 +14518,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14906,8 +14526,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/path-scurry": { "version": "2.0.1", @@ -14930,7 +14549,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -14940,22 +14558,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "license": "MIT", - "peer": true, "dependencies": { "find-up": "^5.0.0" }, @@ -14968,7 +14583,6 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -14983,7 +14597,6 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -15016,7 +14629,6 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6.0" } @@ -15025,15 +14637,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -15046,15 +14656,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -15070,7 +14678,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -15080,7 +14687,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -15096,7 +14702,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -15113,7 +14718,6 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "license": "MIT", - "peer": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -15129,7 +14733,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -15139,7 +14742,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "license": "MIT", - "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -15170,7 +14772,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -15181,7 +14782,6 @@ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -15191,7 +14791,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -15201,7 +14800,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -15224,7 +14822,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", - "peer": true, "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", @@ -15245,7 +14842,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15255,7 +14851,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -15320,7 +14915,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -15336,15 +14930,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -15353,15 +14945,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "license": "WTFPL OR ISC", - "peer": true, "dependencies": { "truncate-utf8-bytes": "^1.0.0" } @@ -15371,8 +14961,7 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/semver": { "version": "7.7.3", @@ -15391,7 +14980,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -15414,7 +15002,6 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", - "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -15431,7 +15018,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -15454,15 +15040,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -15483,8 +15067,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/sharp": { "version": "0.34.5", @@ -15493,7 +15076,6 @@ "hasInstallScript": true, "license": "Apache-2.0", "optional": true, - "peer": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", @@ -15537,7 +15119,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15550,7 +15131,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15572,7 +15152,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -15592,7 +15171,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -15609,7 +15187,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15628,7 +15205,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15647,8 +15223,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/source-map": { "version": "0.6.1", @@ -15674,7 +15249,6 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15684,15 +15258,13 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0", - "peer": true + "license": "CC-BY-3.0" }, "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15702,8 +15274,7 @@ "version": "3.0.22", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0", - "peer": true + "license": "CC0-1.0" }, "node_modules/appium-safari-driver/node_modules/spdy": { "version": "4.0.2", @@ -15711,7 +15282,6 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15729,7 +15299,6 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -15745,7 +15314,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15760,7 +15328,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -15770,7 +15337,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -15780,7 +15346,6 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -15790,7 +15355,6 @@ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", "license": "MIT", - "peer": true, "dependencies": { "duplexer": "~0.1.1", "through": "~2.3.4" @@ -15801,7 +15365,6 @@ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", - "peer": true, "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", @@ -15813,7 +15376,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -15836,15 +15398,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", - "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -15863,7 +15423,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15878,7 +15437,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15887,15 +15445,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15908,7 +15464,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -15925,7 +15480,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15938,7 +15492,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15948,7 +15501,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15964,7 +15516,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -15977,7 +15528,6 @@ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "license": "MIT", - "peer": true, "engines": { "node": ">=20" }, @@ -15990,7 +15540,6 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "license": "MIT", - "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -16018,7 +15567,6 @@ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "b4a": "^1.6.4" } @@ -16027,22 +15575,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -16052,7 +15597,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -16062,7 +15606,6 @@ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "license": "WTFPL", - "peer": true, "dependencies": { "utf8-byte-length": "^1.0.1" } @@ -16079,7 +15622,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", "license": "(MIT OR CC0-1.0)", - "peer": true, "dependencies": { "tagged-tag": "^1.0.0" }, @@ -16095,7 +15637,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", - "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -16110,7 +15651,6 @@ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", "license": "MIT or GPL-2.0", - "peer": true, "engines": { "node": ">= 0.4.0" } @@ -16120,7 +15660,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -16129,15 +15668,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)", - "peer": true + "license": "(WTFPL OR MIT)" }, "node_modules/appium-safari-driver/node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/uuid": { "version": "13.0.0", @@ -16157,7 +15694,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -16168,7 +15704,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -16179,7 +15714,6 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -16189,7 +15723,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -16199,7 +15732,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "license": "ISC", - "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -16215,7 +15747,6 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -16238,7 +15769,6 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -16253,7 +15783,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -16268,7 +15797,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -16283,7 +15811,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -16302,7 +15829,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -16320,7 +15846,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -16329,15 +15854,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16352,7 +15875,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16365,7 +15887,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -16374,15 +15895,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16397,7 +15916,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16409,15 +15927,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -16439,7 +15955,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -16449,7 +15964,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -16459,7 +15973,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -16472,7 +15985,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -16490,7 +16002,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -16499,15 +16010,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -16525,7 +16034,6 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "license": "MIT", - "peer": true, "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" @@ -16539,7 +16047,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -16549,7 +16056,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -16562,7 +16068,6 @@ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -19613,6 +19118,7 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } From 0d1cc62ad47bd258311e7f46558d4e0e8e196480 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 10:48:01 -0800 Subject: [PATCH 18/90] Add AI generation to common --- common/package-lock.json | 151 ++++++++++++- common/package.json | 6 +- common/src/ai.js | 455 +++++++++++++++++++++++++++++++++++++++ common/src/index.js | 5 + common/test/ai.test.js | 371 +++++++++++++++++++++++++++++++ 5 files changed, 985 insertions(+), 3 deletions(-) create mode 100644 common/src/ai.js create mode 100644 common/test/ai.test.js diff --git a/common/package-lock.json b/common/package-lock.json index a3f9052..f3e1ac8 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -9,13 +9,17 @@ "version": "3.6.0", "license": "AGPL-3.0-only", "dependencies": { + "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/openai": "^2.0.80", "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.108", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "yaml": "^2.8.2" + "yaml": "^2.8.2", + "zod": "^4.1.13" }, "devDependencies": { "chai": "^6.2.1", @@ -23,6 +27,84 @@ "sinon": "^21.0.0" } }, + "node_modules/@ai-sdk/anthropic": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.53.tgz", + "integrity": "sha512-ih7NV+OFSNWZCF+tYYD7ovvvM+gv7TRKQblpVohg2ipIwC9Y0TirzocJVREzZa/v9luxUwFbsPji++DUDWWxsg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", + "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@vercel/oidc": "3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "2.0.80", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.80.tgz", + "integrity": "sha512-tNHuraF11db+8xJEDBoU9E3vMcpnHFKRhnLQ3DQX2LnEzfPB9DksZ8rE+yVuDN1WRW9cm2OWAhgHFgVKs7ICuw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "15.1.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", @@ -141,6 +223,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -191,18 +282,50 @@ "node": ">=4" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "peer": true }, + "node_modules/@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/ai": { + "version": "5.0.108", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.108.tgz", + "integrity": "sha512-Jex3Lb7V41NNpuqJHKgrwoU6BCLHdI1Pg4qb4GJH4jRIDRXUBySJErHjyN4oTCwbiYCeb/8II9EnqSRPq9EifA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "2.0.18", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -564,6 +687,15 @@ "node": ">=6" } }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -867,6 +999,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -1508,6 +1646,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/common/package.json b/common/package.json index 1bfacfa..4c181f9 100644 --- a/common/package.json +++ b/common/package.json @@ -25,12 +25,16 @@ "sinon": "^21.0.0" }, "dependencies": { + "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/openai": "^2.0.80", "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.108", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "yaml": "^2.8.2" + "yaml": "^2.8.2", + "zod": "^4.1.13" } } diff --git a/common/src/ai.js b/common/src/ai.js new file mode 100644 index 0000000..23a6bcf --- /dev/null +++ b/common/src/ai.js @@ -0,0 +1,455 @@ +const { generateText, generateObject, jsonSchema } = require("ai"); +const { createOpenAI } = require("@ai-sdk/openai"); +const { createAnthropic } = require("@ai-sdk/anthropic"); +const { z } = require("zod"); +const Ajv = require("ajv"); +const addFormats = require("ajv-formats"); + +const DEFAULT_MODEL = "anthropic/claude-haiku-4.5"; +const MAX_SCHEMA_VALIDATION_RETRIES = 3; + +/** + * Maps our supported model enums to the model identifiers that platforms expect. + */ +const modelMap = { + // Anthropic models + "anthropic/claude-haiku-4.5": "claude-haiku-4-5", + "anthropic/claude-sonnet-4.5": "claude-sonnet-4-5", + "anthropic/claude-opus-4.5": "claude-opus-4-5", +}; + +/** + * Detects the platform-specific model identifier from a model string. + * @param {string} model - The model identifier. + * @returns {string | null} The platform-specific model identifier or null if not found. + */ +const detectModel = (model) => { + if (!model) return null; + return modelMap[model] || null; +}; + +/** + * Detects the provider and model from a model string. + * @param {string} model - The model identifier. + * @returns {{ provider: "openai" | "anthropic" | null, model: string | null }} The detected provider and model. + */ +const detectProvider = (model) => { + if (!model) return { provider: null, model: null }; + + const openaiPatterns = [/^openai\//]; + const anthropicPatterns = [/^anthropic\//]; + + const detectedModel = detectModel(model); + + if (openaiPatterns.some((pattern) => pattern.test(model))) { + return { provider: "openai", model: detectedModel }; + } + + if (anthropicPatterns.some((pattern) => pattern.test(model))) { + return { provider: "anthropic", model: detectedModel }; + } + + return { provider: null, model: null }; +}; + +/** + * Creates a provider instance based on the provider name. + * @param {Object} options + * @param {"openai" | "anthropic"} options.provider - The provider name. + * @param {string} [options.apiKey] - Optional API key override. + * @param {string} [options.baseURL] - Optional base URL override. + * @returns {Function} The provider factory function. + */ +const createProvider = ({ provider, apiKey, baseURL }) => { + if (provider === "openai") { + const options = {}; + if (apiKey) options.apiKey = apiKey; + if (baseURL) options.baseURL = baseURL; + return createOpenAI(options); + } + + if (provider === "anthropic") { + const options = {}; + if (apiKey) options.apiKey = apiKey; + if (baseURL) options.baseURL = baseURL; + return createAnthropic(options); + } + + throw new Error(`Unsupported provider: ${provider}`); +}; + +/** + * Converts a file object to AI SDK image part format. + * @param {Object} file - The file object. + * @param {string} file.type - The file type (e.g., "image"). + * @param {string} file.data - Base64 data or URL. + * @param {string} [file.mimeType] - The MIME type (e.g., "image/png"). + * @returns {Object} The AI SDK image part. + */ +const fileToImagePart = (file) => { + if (file.type !== "image") { + throw new Error(`Unsupported file type: ${file.type}. Only "image" is supported.`); + } + + // Check if data is a URL + const isUrl = file.data.startsWith("http://") || file.data.startsWith("https://"); + + if (isUrl) { + return { + type: "image", + image: new URL(file.data), + }; + } + + // Base64 data + return { + type: "image", + image: file.data, + mimeType: file.mimeType, + }; +}; + +/** + * Builds message content from prompt and files. + * @param {Object} options + * @param {string} options.prompt - The text prompt. + * @param {Array} [options.files] - Optional array of file objects. + * @returns {string | Array} The message content. + */ +const buildMessageContent = ({ prompt, files }) => { + if (!files || files.length === 0) { + return prompt; + } + + const parts = []; + + // Add text part + parts.push({ type: "text", text: prompt }); + + // Add file parts + for (const file of files) { + parts.push(fileToImagePart(file)); + } + + return parts; +}; + +/** + * Checks if a schema is a Zod schema. + * @param {Object} schema - The schema to check. + * @returns {boolean} True if the schema is a Zod schema. + */ +const isZodSchema = (schema) => { + return schema && typeof schema.safeParse === "function"; +}; + +/** + * Validates an object against a Zod schema. + * @param {Object} object - The object to validate. + * @param {z.ZodSchema} schema - The Zod schema. + * @returns {{ valid: boolean, errors: string | null, object: Object }} Validation result. + */ +const validateAgainstZodSchema = (object, schema) => { + const result = schema.safeParse(object); + + if (result.success) { + return { valid: true, errors: null, object: result.data }; + } + + const errors = result.error.issues + .map((issue) => `${issue.path.join(".")}: ${issue.message}`) + .join(", "); + + return { valid: false, errors, object }; +}; + +/** + * Validates an object against a JSON schema. + * @param {Object} object - The object to validate. + * @param {Object} schema - The JSON schema. + * @returns {{ valid: boolean, errors: string | null, object: Object }} Validation result. + */ +const validateAgainstJsonSchema = (object, schema) => { + const ajv = new Ajv({ allErrors: true, useDefaults: true, coerceTypes: true }); + addFormats(ajv); + + const validate = ajv.compile(schema); + const valid = validate(object); + + if (valid) { + return { valid: true, errors: null, object }; + } + + const errors = validate.errors + .map((error) => `${error.instancePath || "/"} ${error.message}`) + .join(", "); + + return { valid: false, errors, object }; +}; + +/** + * Validates an object against a schema (Zod or JSON schema). + * @param {Object} object - The object to validate. + * @param {z.ZodSchema | Object} schema - The Zod or JSON schema. + * @returns {{ valid: boolean, errors: string | null, object: Object }} Validation result. + */ +const validateAgainstSchema = (object, schema) => { + if (isZodSchema(schema)) { + return validateAgainstZodSchema(object, schema); + } + return validateAgainstJsonSchema(object, schema); +}; + +/** + * Converts a schema to the format expected by the AI SDK. + * Zod schemas are passed directly; JSON schemas are wrapped with jsonSchema(). + * @param {z.ZodSchema | Object} schema - The Zod or JSON schema. + * @returns {Object} The schema in AI SDK format. + */ +const toAiSdkSchema = (schema) => { + if (isZodSchema(schema)) { + return schema; + } + return jsonSchema(schema); +}; + +/** + * Generates text or structured output using an AI model. + * + * @param {Object} options - Generation options. + * @param {string} [options.prompt] - The text prompt (required if messages not provided). + * @param {Array} [options.messages] - Array of messages for multi-turn conversation. + * @param {Array} [options.files] - Array of file objects to include (e.g., images). + * @param {string} [options.files[].type] - File type ("image"). + * @param {string} [options.files[].data] - Base64 data or URL. + * @param {string} [options.files[].mimeType] - MIME type (e.g., "image/png"). + * @param {string} [options.model] - Model identifier (default: "claude-3-5-haiku-latest"). + * @param {string} [options.system] - System message. + * @param {z.ZodSchema | Object} [options.schema] - Zod schema or JSON schema for structured output. + * @param {string} [options.schemaName] - Name for the schema (used in API calls). + * @param {string} [options.schemaDescription] - Description for the schema. + * @param {"openai" | "anthropic"} [options.provider] - Explicit provider override. + * @param {string} [options.apiKey] - API key override (falls back to env vars). + * @param {string} [options.baseURL] - Base URL override for the provider. + * @param {number} [options.temperature] - Temperature for generation. + * @param {number} [options.maxTokens] - Maximum tokens to generate. + * @returns {Promise} Generation result. + * @returns {string} [result.text] - Generated text (when no schema provided). + * @returns {Object} [result.object] - Generated object (when schema provided). + * @returns {Object} result.usage - Token usage information. + * @returns {string} result.finishReason - Why generation stopped. + * + * @throws {Error} If prompt/messages is missing or provider cannot be determined. + */ +const generate = async ({ + prompt, + messages, + files, + model = DEFAULT_MODEL, + system, + schema, + schemaName, + schemaDescription, + provider, + apiKey, + baseURL, + temperature, + maxTokens, +}) => { + // Validate required input + if (!prompt && (!messages || messages.length === 0)) { + throw new Error("Either 'prompt' or 'messages' is required."); + } + + // Determine provider and model + const detected = detectProvider(model); + const resolvedProvider = provider || detected.provider; + const resolvedModel = detected.model || model; + + if (!resolvedProvider) { + throw new Error( + `Cannot determine provider for model "${model}". Please specify a 'provider' option ("openai" or "anthropic").` + ); + } + + // Create provider instance + const providerFactory = createProvider({ + provider: resolvedProvider, + apiKey, + baseURL, + }); + + // Get model instance + const modelInstance = providerFactory(resolvedModel); + + // Build generation options + const generationOptions = { + model: modelInstance, + }; + + // Add system message if provided + if (system) { + generationOptions.system = system; + } + + // Add temperature if provided + if (temperature !== undefined) { + generationOptions.temperature = temperature; + } + + // Add maxTokens if provided + if (maxTokens !== undefined) { + generationOptions.maxTokens = maxTokens; + } + + // Build messages or prompt + if (messages && messages.length > 0) { + // Use messages array directly + generationOptions.messages = messages.map((msg) => { + if (msg.role === "user" && files && files.length > 0) { + return { + ...msg, + content: buildMessageContent({ prompt: msg.content, files }), + }; + } + return msg; + }); + } else if (files && files.length > 0) { + // When files are provided, we must use messages format for multimodal content + generationOptions.messages = [ + { + role: "user", + content: buildMessageContent({ prompt, files }), + }, + ]; + } else { + // Use simple prompt for text-only requests + generationOptions.prompt = prompt; + } + + // Handle structured output with schema + if (schema) { + return generateWithSchemaValidation({ + generationOptions, + schema, + schemaName, + schemaDescription, + prompt, + messages, + }); + } + + // Generate text + const result = await generateText(generationOptions); + + return { + text: result.text, + usage: result.usage, + finishReason: result.finishReason, + }; +}; + +/** + * Generates structured output with schema validation and retry logic. + * @param {Object} options + * @param {Object} options.generationOptions - AI SDK generation options. + * @param {z.ZodSchema | Object} options.schema - Zod schema or JSON schema for validation. + * @param {string} [options.schemaName] - Name for the schema. + * @param {string} [options.schemaDescription] - Description for the schema. + * @param {string} [options.prompt] - Original prompt for retry context. + * @param {Array} [options.messages] - Original messages for retry context. + * @returns {Promise} Generation result with validated object. + */ +const generateWithSchemaValidation = async ({ + generationOptions, + schema, + schemaName, + schemaDescription, + prompt, + messages, +}) => { + let lastError = null; + let lastObject = null; + + // Convert schema to AI SDK format (wraps JSON schemas with jsonSchema()) + const aiSdkSchema = toAiSdkSchema(schema); + + for (let attempt = 1; attempt <= MAX_SCHEMA_VALIDATION_RETRIES; attempt++) { + const objectOptions = { + ...generationOptions, + schema: aiSdkSchema, + }; + + if (schemaName) { + objectOptions.schemaName = schemaName; + } + + if (schemaDescription) { + objectOptions.schemaDescription = schemaDescription; + } + + // Add retry context if this is a retry attempt + if (attempt > 1 && lastError) { + const retryMessage = `Previous attempt failed schema validation with errors: ${lastError}. Please fix these issues and try again.`; + + if (objectOptions.messages) { + // Add retry context to messages + objectOptions.messages = [ + ...objectOptions.messages, + { role: "assistant", content: JSON.stringify(lastObject) }, + { role: "user", content: retryMessage }, + ]; + } else if (typeof objectOptions.prompt === "string") { + // Add retry context to prompt + objectOptions.prompt = `${objectOptions.prompt}\n\n${retryMessage}`; + } + } + + try { + const result = await generateObject(objectOptions); + + // Validate the generated object against the schema ourselves + const validation = validateAgainstSchema(result.object, schema); + + if (validation.valid) { + return { + object: validation.object, + usage: result.usage, + finishReason: result.finishReason, + }; + } + + // Schema validation failed, store error for retry + lastError = validation.errors; + lastObject = result.object; + + if (attempt === MAX_SCHEMA_VALIDATION_RETRIES) { + throw new Error( + `Schema validation failed after ${MAX_SCHEMA_VALIDATION_RETRIES} attempts. Last errors: ${validation.errors}` + ); + } + } catch (error) { + // If it's our validation error and we have retries left, continue + if (error.message.includes("Schema validation failed after") || attempt === MAX_SCHEMA_VALIDATION_RETRIES) { + throw error; + } + + // Store the error and retry + lastError = error.message; + lastObject = null; + } + } + + throw new Error( + `Schema validation failed after ${MAX_SCHEMA_VALIDATION_RETRIES} attempts. Last errors: ${lastError}` + ); +}; + +module.exports = { + generate, + detectProvider, + detectModel, + modelMap, + DEFAULT_MODEL, + MAX_SCHEMA_VALIDATION_RETRIES, +}; diff --git a/common/src/index.js b/common/src/index.js index c1f0f0c..8afa1a5 100644 --- a/common/src/index.js +++ b/common/src/index.js @@ -2,6 +2,7 @@ const { schemas } = require("./schemas"); const { validate, transformToSchemaKey } = require("./validate"); const { resolvePaths } = require("./resolvePaths"); const { readFile } = require("./files"); +const { generate, detectProvider, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); module.exports = { schemas, @@ -9,4 +10,8 @@ module.exports = { resolvePaths, readFile, transformToSchemaKey, + generate, + detectProvider, + DEFAULT_MODEL, + MAX_SCHEMA_VALIDATION_RETRIES, }; diff --git a/common/test/ai.test.js b/common/test/ai.test.js new file mode 100644 index 0000000..6208177 --- /dev/null +++ b/common/test/ai.test.js @@ -0,0 +1,371 @@ +const { z } = require("zod"); + +(async () => { + const { expect } = await import("chai"); + + // Import AI module functions + const { + generate, + detectProvider, + detectModel, + modelMap, + DEFAULT_MODEL, + MAX_SCHEMA_VALIDATION_RETRIES, + } = require("../src/ai"); + + describe("AI Module", function () { + // Increase timeout for real API calls + this.timeout(60000); + + describe("modelMap", function () { + it("should contain Anthropic model mappings", function () { + expect(modelMap["anthropic/claude-haiku-4.5"]).to.equal("claude-haiku-4-5"); + expect(modelMap["anthropic/claude-sonnet-4.5"]).to.equal("claude-sonnet-4-5"); + expect(modelMap["anthropic/claude-opus-4.5"]).to.equal("claude-opus-4-5"); + }); + }); + + describe("detectModel", function () { + it("should return mapped model for known models", function () { + expect(detectModel("anthropic/claude-haiku-4.5")).to.equal("claude-haiku-4-5"); + expect(detectModel("anthropic/claude-sonnet-4.5")).to.equal("claude-sonnet-4-5"); + expect(detectModel("anthropic/claude-opus-4.5")).to.equal("claude-opus-4-5"); + }); + + it("should return null for unknown models", function () { + expect(detectModel("unknown-model")).to.be.null; + expect(detectModel("openai/gpt-4")).to.be.null; + }); + + it("should return null for empty or null input", function () { + expect(detectModel("")).to.be.null; + expect(detectModel(null)).to.be.null; + expect(detectModel(undefined)).to.be.null; + }); + }); + + describe("detectProvider", function () { + it("should detect OpenAI for gpt- models", function () { + expect(detectProvider("openai/gpt-4")).to.deep.equal({ provider: "openai", model: null }); + expect(detectProvider("openai/gpt-3.5-turbo")).to.deep.equal({ provider: "openai", model: null }); + expect(detectProvider("openai/gpt-4o")).to.deep.equal({ provider: "openai", model: null }); + }); + + it("should detect OpenAI for o1/o3 models", function () { + expect(detectProvider("openai/o1-preview")).to.deep.equal({ provider: "openai", model: null }); + expect(detectProvider("openai/o1-mini")).to.deep.equal({ provider: "openai", model: null }); + expect(detectProvider("openai/o3-mini")).to.deep.equal({ provider: "openai", model: null }); + }); + + it("should detect Anthropic for claude- models", function () { + expect(detectProvider("anthropic/claude-3-5-haiku-latest")).to.deep.equal({ provider: "anthropic", model: null }); + expect(detectProvider("anthropic/claude-3-opus-20240229")).to.deep.equal({ provider: "anthropic", model: null }); + expect(detectProvider("anthropic/claude-3-sonnet-20240229")).to.deep.equal({ provider: "anthropic", model: null }); + }); + + it("should detect Anthropic and return mapped model for known models", function () { + expect(detectProvider("anthropic/claude-haiku-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-haiku-4-5" }); + expect(detectProvider("anthropic/claude-sonnet-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-sonnet-4-5" }); + expect(detectProvider("anthropic/claude-opus-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-opus-4-5" }); + }); + + it("should return null provider and model for unknown models", function () { + expect(detectProvider("unknown-model")).to.deep.equal({ provider: null, model: null }); + expect(detectProvider("gemini-pro")).to.deep.equal({ provider: null, model: null }); + expect(detectProvider("llama-2")).to.deep.equal({ provider: null, model: null }); + }); + + it("should return null provider and model for empty or null input", function () { + expect(detectProvider("")).to.deep.equal({ provider: null, model: null }); + expect(detectProvider(null)).to.deep.equal({ provider: null, model: null }); + expect(detectProvider(undefined)).to.deep.equal({ provider: null, model: null }); + }); + }); + + describe("DEFAULT_MODEL", function () { + it("should be anthropic/claude-haiku-4.5", function () { + expect(DEFAULT_MODEL).to.equal("anthropic/claude-haiku-4.5"); + }); + }); + + describe("MAX_SCHEMA_VALIDATION_RETRIES", function () { + it("should be 3", function () { + expect(MAX_SCHEMA_VALIDATION_RETRIES).to.equal(3); + }); + }); + + describe("generate", function () { + describe("input validation", function () { + it("should throw error when neither prompt nor messages provided", async function () { + try { + await generate({}); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("Either 'prompt' or 'messages' is required."); + } + }); + + it("should throw error when messages array is empty", async function () { + try { + await generate({ messages: [] }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("Either 'prompt' or 'messages' is required."); + } + }); + + it("should throw error when provider cannot be determined", async function () { + try { + await generate({ prompt: "Hello", model: "unknown-model" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.include("Cannot determine provider"); + expect(error.message).to.include("unknown-model"); + } + }); + }); + + describe("text generation", function () { + it("should generate text with default model (Anthropic)", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Say exactly: Hello World", + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should generate text with OpenAI model", async function () { + // Skip if no API key is set + if (!process.env.OPENAI_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Say exactly: Hello World", + model: "openai/gpt-4o-mini", + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should generate text with explicit provider override", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Say exactly: Test", + model: "anthropic/claude-haiku-4.5", + provider: "anthropic", + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + }); + + it("should include system message in generation", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "What is your name?", + system: "You are a helpful assistant named TestBot. Always respond with your name.", + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.toLowerCase()).to.include("testbot"); + }); + }); + + describe("structured output with schema validation", function () { + const personSchema = z.object({ + name: z.string().describe("The person's full name"), + age: z.number().min(0).max(150).describe("The person's age in years"), + }); + + // JSON Schema equivalent for testing + const personJsonSchema = { + type: "object", + properties: { + name: { type: "string", description: "The person's full name" }, + age: { type: "number", minimum: 0, maximum: 150, description: "The person's age in years" }, + }, + required: ["name", "age"], + additionalProperties: false, + }; + + it("should generate valid structured output with Zod schema", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Generate a fictional person named Alice who is 28 years old", + schema: personSchema, + schemaName: "Person", + }); + + expect(result.object).to.be.an("object"); + expect(result.object.name).to.be.a("string"); + expect(result.object.age).to.be.a("number"); + expect(result.object.age).to.be.at.least(0); + expect(result.object.age).to.be.at.most(150); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should generate valid structured output with JSON schema", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Generate a fictional person named Bob who is 42 years old", + schema: personJsonSchema, + schemaName: "Person", + }); + + expect(result.object).to.be.an("object"); + expect(result.object.name).to.be.a("string"); + expect(result.object.age).to.be.a("number"); + expect(result.object.age).to.be.at.least(0); + expect(result.object.age).to.be.at.most(150); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should validate generated object against Zod schema", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const strictSchema = z.object({ + color: z.enum(["red", "green", "blue"]).describe("One of: red, green, blue"), + count: z.number().int().min(1).max(10).describe("An integer from 1 to 10"), + }); + + const result = await generate({ + prompt: "Generate an object with color 'blue' and count 5", + schema: strictSchema, + schemaName: "ColorCount", + }); + + expect(result.object.color).to.be.oneOf(["red", "green", "blue"]); + expect(result.object.count).to.be.a("number"); + expect(result.object.count).to.be.at.least(1); + expect(result.object.count).to.be.at.most(10); + expect(Number.isInteger(result.object.count)).to.be.true; + }); + + it("should validate generated object against JSON schema", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const strictJsonSchema = { + type: "object", + properties: { + color: { type: "string", enum: ["red", "green", "blue"], description: "One of: red, green, blue" }, + count: { type: "integer", minimum: 1, maximum: 10, description: "An integer from 1 to 10" }, + }, + required: ["color", "count"], + additionalProperties: false, + }; + + const result = await generate({ + prompt: "Generate an object with color 'green' and count 7", + schema: strictJsonSchema, + schemaName: "ColorCount", + }); + + expect(result.object.color).to.be.oneOf(["red", "green", "blue"]); + expect(result.object.count).to.be.a("number"); + expect(result.object.count).to.be.at.least(1); + expect(result.object.count).to.be.at.most(10); + expect(Number.isInteger(result.object.count)).to.be.true; + }); + }); + + describe("multimodal input with files", function () { + it("should handle image URL input", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "What colors do you see in this image? Be brief.", + files: [ + { + type: "image", + data: "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + }); + }); + + describe("messages array support", function () { + it("should handle multi-turn conversation", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await generate({ + messages: [ + { role: "user", content: "My name is Alice." }, + { role: "assistant", content: "Hello Alice! Nice to meet you." }, + { role: "user", content: "What is my name?" }, + ], + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.toLowerCase()).to.include("alice"); + }); + }); + + describe("error handling", function () { + it("should throw error with invalid API key", async function () { + try { + await generate({ + prompt: "Hello", + apiKey: "invalid-api-key", + }); + expect.fail("Should have thrown an error"); + } catch (error) { + // Should get an authentication error + expect(error).to.be.an("error"); + } + }); + }); + }); + }); +})(); From a8adc32912e29d5d8e6b3ed21feb194e7162f7bf Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:00:13 -0800 Subject: [PATCH 19/90] Add variant selector handling to FieldEditor input --- cli/src/cli/builder/FieldEditor.mjs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cli/src/cli/builder/FieldEditor.mjs b/cli/src/cli/builder/FieldEditor.mjs index 84aad68..ad33d8b 100644 --- a/cli/src/cli/builder/FieldEditor.mjs +++ b/cli/src/cli/builder/FieldEditor.mjs @@ -354,6 +354,14 @@ const FieldEditor = ({ onSubmit(localValue); }; + const handleStringChange = (val) => { + if (val === '?' && hasMultipleVariants && localValue === '') { + setShowVariantSelector(true); + } else { + setLocalValue(val); + } + }; + return React.createElement( Box, { flexDirection: 'column' }, @@ -372,7 +380,7 @@ const FieldEditor = ({ ), React.createElement(SimpleTextInput, { value: localValue, - onChange: setLocalValue, + onChange: handleStringChange, onSubmit: handleSubmit, focus: autoFocus, }) From 77fd02c49102be2e49d5a81b845351efa9c2b944 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:01:51 -0800 Subject: [PATCH 20/90] Refactor FieldEditor to improve variant handling logic --- cli/src/cli/builder/FieldEditor.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cli/src/cli/builder/FieldEditor.mjs b/cli/src/cli/builder/FieldEditor.mjs index ad33d8b..1b1d4df 100644 --- a/cli/src/cli/builder/FieldEditor.mjs +++ b/cli/src/cli/builder/FieldEditor.mjs @@ -102,7 +102,7 @@ const FieldEditor = ({ } }, [localValue, effectiveField.pattern]); - // Handle escape key + // Handle escape and tab keys useInput((input, key) => { if (key.escape) { if (showVariantSelector) { @@ -111,6 +111,9 @@ const FieldEditor = ({ onCancel(); } } + if (key.tab && hasMultipleVariants) { + setShowVariantSelector(true); + } }); // Show variant selector first if field has multiple variants and none selected From 24fee6c90fe4fd99a9efad002ddb7c4b51d453e7 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:04:55 -0800 Subject: [PATCH 21/90] Auto-show variant selector for new values with multiple variants --- cli/src/cli/builder/FieldEditor.mjs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cli/src/cli/builder/FieldEditor.mjs b/cli/src/cli/builder/FieldEditor.mjs index 1b1d4df..be9b2ba 100644 --- a/cli/src/cli/builder/FieldEditor.mjs +++ b/cli/src/cli/builder/FieldEditor.mjs @@ -116,10 +116,15 @@ const FieldEditor = ({ } }); + // Auto-show variant selector for new values with multiple variants + useEffect(() => { + if (hasMultipleVariants && !selectedVariant && showVariantSelector === false && value === undefined) { + setShowVariantSelector(true); + } + }, [hasMultipleVariants, selectedVariant, showVariantSelector, value]); + // Show variant selector first if field has multiple variants and none selected if (hasMultipleVariants && !selectedVariant && showVariantSelector === false && value === undefined) { - // Auto-show variant selector for new values - setShowVariantSelector(true); return null; } From b1ccb0560daa54d9979918d286b40587a895b5fa Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:14:58 -0800 Subject: [PATCH 22/90] Add validation for required field value in FieldEditor --- cli/src/cli/builder/FieldEditor.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cli/src/cli/builder/FieldEditor.mjs b/cli/src/cli/builder/FieldEditor.mjs index be9b2ba..4c02389 100644 --- a/cli/src/cli/builder/FieldEditor.mjs +++ b/cli/src/cli/builder/FieldEditor.mjs @@ -300,6 +300,10 @@ const FieldEditor = ({ const handleSubmit = () => { if (error) return; + if (localValue === '' && effectiveField.default === undefined) { + setError('A value is required'); + return; + } const num = localValue === '' ? effectiveField.default : Number(localValue); onChange(num); onSubmit(num); From 7cd7af08ddcbaa4059956250786fb6259c65041e Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:43:10 -0800 Subject: [PATCH 23/90] Refactor TestEditor to update local test state and trigger onChange callback --- cli/src/cli/builder/TestEditor.mjs | 32 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/cli/src/cli/builder/TestEditor.mjs b/cli/src/cli/builder/TestEditor.mjs index 863f3c2..5ca4519 100644 --- a/cli/src/cli/builder/TestEditor.mjs +++ b/cli/src/cli/builder/TestEditor.mjs @@ -82,7 +82,9 @@ const TestEditor = ({ field: fieldDef, value: currentValue, onChange: (newValue) => { - setLocalTest({ ...localTest, [editingField]: newValue }); + const updatedTest = { ...localTest, [editingField]: newValue }; + setLocalTest(updatedTest); + onChange(updatedTest); }, onSubmit: () => setView('menu'), onCancel: () => setView('menu'), @@ -100,12 +102,16 @@ const TestEditor = ({ onChange: (updatedStep) => { const newSteps = [...(localTest.steps || [])]; newSteps[editingStepIndex] = updatedStep; - setLocalTest({ ...localTest, steps: newSteps }); + const updatedTest = { ...localTest, steps: newSteps }; + setLocalTest(updatedTest); + onChange(updatedTest); }, onSave: (updatedStep) => { const newSteps = [...(localTest.steps || [])]; newSteps[editingStepIndex] = updatedStep; - setLocalTest({ ...localTest, steps: newSteps }); + const updatedTest = { ...localTest, steps: newSteps }; + setLocalTest(updatedTest); + onChange(updatedTest); setView('menu'); setEditingStepIndex(null); }, @@ -116,7 +122,9 @@ const TestEditor = ({ onDelete: () => { const newSteps = [...(localTest.steps || [])]; newSteps.splice(editingStepIndex, 1); - setLocalTest({ ...localTest, steps: newSteps }); + const updatedTest = { ...localTest, steps: newSteps }; + setLocalTest(updatedTest); + onChange(updatedTest); setView('menu'); setEditingStepIndex(null); }, @@ -134,7 +142,9 @@ const TestEditor = ({ onChange: () => {}, onSave: (newStep) => { const newSteps = [...(localTest.steps || []), newStep]; - setLocalTest({ ...localTest, steps: newSteps }); + const updatedTest = { ...localTest, steps: newSteps }; + setLocalTest(updatedTest); + onChange(updatedTest); setView('menu'); }, onCancel: () => setView('menu'), @@ -218,9 +228,10 @@ const TestEditor = ({ React.createElement(SelectInput, { items, onSelect: (item) => { - const newTest = { ...localTest }; - delete newTest[item.value]; - setLocalTest(newTest); + const updatedTest = { ...localTest }; + delete updatedTest[item.value]; + setLocalTest(updatedTest); + onChange(updatedTest); setView('menu'); }, }) @@ -271,9 +282,10 @@ const TestEditor = ({ .filter((f) => f.name !== 'steps' && f.name !== '$schema' && localTest[f.name] !== undefined) .forEach((f) => { const val = localTest[f.name]; - const displayVal = typeof val === 'object' ? JSON.stringify(val).substring(0, 50) : String(val).substring(0, 50); + const stringSource = typeof val === 'object' ? JSON.stringify(val) : String(val); + const displayVal = stringSource.substring(0, 50); menuItems.push({ - label: ` ✏️ ${f.name}: ${displayVal}${String(val).length > 50 ? '...' : ''}`, + label: ` ✏️ ${f.name}: ${displayVal}${stringSource.length > 50 ? '...' : ''}`, value: `editMeta:${f.name}`, }); }); From c5b13450ebb01de5068cc30cce5cb7261e5807bd Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:44:01 -0800 Subject: [PATCH 24/90] Add warning for missing field definition in TestEditor metadata view --- cli/src/cli/builder/TestEditor.mjs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cli/src/cli/builder/TestEditor.mjs b/cli/src/cli/builder/TestEditor.mjs index 5ca4519..dc4ccb2 100644 --- a/cli/src/cli/builder/TestEditor.mjs +++ b/cli/src/cli/builder/TestEditor.mjs @@ -69,6 +69,29 @@ const TestEditor = ({ // Edit metadata field view if (view === 'editMeta' && editingField) { const fieldDef = testFields.find((f) => f.name === editingField); + + if (!fieldDef) { + console.warn(`[TestEditor] Missing field definition for editingField: "${editingField}"`); + return React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(StatusBar, { + location: ['Test ' + (testIndex + 1), editingField], + validationStatus: validation.valid, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'yellow' }, `⚠️ Unknown field: "${editingField}"`) + ), + React.createElement( + Text, + { color: 'gray' }, + 'Press Esc to go back' + ) + ); + } + const currentValue = localTest[editingField]; return React.createElement( From 7acde2f05d089230473ccf943f02858f6f045700 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:50:06 -0800 Subject: [PATCH 25/90] Add file matching logic and sourcePath tracking for specs in CLI --- cli/src/index.js | 221 +++++++++++++++++++++++++++++++++++++----- resolver/src/utils.js | 4 + 2 files changed, 203 insertions(+), 22 deletions(-) diff --git a/cli/src/index.js b/cli/src/index.js index 197f1e2..54386bc 100755 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -13,10 +13,199 @@ const { const { argv } = require("node:process"); const path = require("path"); const fs = require("fs"); +const crypto = require("crypto"); const { validate } = require("doc-detective-common"); const { detectTests } = require("doc-detective-resolver"); const yaml = require("js-yaml"); +/** + * Compute a content hash for a file to enable content-based matching. + * @param {string} filePath - Absolute path to the file + * @returns {string|null} MD5 hash of file content, or null if file can't be read + */ +function computeFileHash(filePath) { + try { + const content = fs.readFileSync(filePath, 'utf-8'); + return crypto.createHash('md5').update(content).digest('hex'); + } catch { + return null; + } +} + +/** + * Canonicalize a spec object for content comparison. + * Removes volatile fields like sourcePath, contentPath, specId that don't affect spec content. + * @param {Object} spec - The spec object to canonicalize + * @returns {string} JSON string of canonicalized spec + */ +function canonicalizeSpec(spec) { + const clone = JSON.parse(JSON.stringify(spec)); + // Remove metadata fields that don't represent actual spec content + delete clone.sourcePath; + delete clone.contentPath; + delete clone.specId; + // Sort keys for consistent comparison + return JSON.stringify(clone, Object.keys(clone).sort()); +} + +/** + * Match detected specs to their source files using explicit metadata first, + * then falling back to heuristics. + * + * Matching priority: + * 1. Explicit sourcePath property (set by resolver) + * 2. contentPath property (for markdown files) + * 3. Exact filename/basename match + * 4. Content hash comparison (parse file content and compare to spec) + * 5. Error if no reliable match found + * + * @param {Array} detectedSpecs - Specs returned by the resolver + * @param {Array} inputPaths - Input file paths provided by the user + * @returns {Array} Array of { spec, filePath, matchMethod, error } objects + */ +function matchSpecsToSourceFiles(detectedSpecs, inputPaths) { + const results = []; + const usedInputPaths = new Set(); + + // Build a map of input paths by basename for quick lookup + const inputsByBasename = new Map(); + for (const inputPath of inputPaths) { + const basename = path.basename(inputPath); + if (!inputsByBasename.has(basename)) { + inputsByBasename.set(basename, []); + } + inputsByBasename.get(basename).push(inputPath); + } + + // Build a map of input paths by resolved absolute path + const inputsByAbsPath = new Map(); + for (const inputPath of inputPaths) { + const absPath = path.resolve(inputPath); + inputsByAbsPath.set(absPath, inputPath); + } + + for (const detectedSpec of detectedSpecs) { + let matchedPath = null; + let matchMethod = null; + let error = null; + + // Priority 1: Use explicit sourcePath property (set by resolver for all file types) + if (detectedSpec.sourcePath) { + const absSourcePath = path.resolve(detectedSpec.sourcePath); + if (inputsByAbsPath.has(absSourcePath)) { + matchedPath = absSourcePath; + matchMethod = 'sourcePath'; + } else if (fs.existsSync(absSourcePath)) { + // sourcePath exists but wasn't in inputPaths - still use it + matchedPath = absSourcePath; + matchMethod = 'sourcePath'; + } + } + + // Priority 2: Use contentPath property (typically set for markdown files) + if (!matchedPath && detectedSpec.contentPath) { + const absContentPath = path.resolve(detectedSpec.contentPath); + if (inputsByAbsPath.has(absContentPath)) { + matchedPath = absContentPath; + matchMethod = 'contentPath'; + } else if (fs.existsSync(absContentPath)) { + matchedPath = absContentPath; + matchMethod = 'contentPath'; + } + } + + // Priority 3: Try exact filename/basename match + if (!matchedPath) { + // If spec has a specId that looks like a filename, try to match it + const specId = detectedSpec.specId; + if (specId && inputsByBasename.has(specId)) { + const candidates = inputsByBasename.get(specId).filter(p => !usedInputPaths.has(p)); + if (candidates.length === 1) { + matchedPath = path.resolve(candidates[0]); + matchMethod = 'specIdMatch'; + } + } + } + + // Priority 4: Content hash comparison for JSON/YAML files + if (!matchedPath) { + const jsonYamlInputs = inputPaths.filter(p => { + const ext = path.extname(p).toLowerCase(); + return (ext === '.json' || ext === '.yaml' || ext === '.yml') && !usedInputPaths.has(p); + }); + + if (jsonYamlInputs.length > 0) { + const canonicalSpec = canonicalizeSpec(detectedSpec); + const matchingFiles = []; + + for (const inputPath of jsonYamlInputs) { + try { + const content = fs.readFileSync(inputPath, 'utf-8'); + let parsedContent; + const ext = path.extname(inputPath).toLowerCase(); + + if (ext === '.json') { + parsedContent = JSON.parse(content); + } else { + parsedContent = yaml.load(content); + } + + // Canonicalize and compare + const canonicalInput = canonicalizeSpec(parsedContent); + if (canonicalSpec === canonicalInput) { + matchingFiles.push(inputPath); + } + } catch { + // Skip files that can't be parsed + continue; + } + } + + if (matchingFiles.length === 1) { + matchedPath = path.resolve(matchingFiles[0]); + matchMethod = 'contentMatch'; + } else if (matchingFiles.length > 1) { + // Multiple matches - ambiguous, report error + error = `Ambiguous match: spec with ID "${detectedSpec.specId}" matches multiple files: ${matchingFiles.join(', ')}. Please provide explicit file paths.`; + } + } + } + + // Priority 5: Single remaining unmatched input for single unmatched spec + if (!matchedPath && !error) { + const unmatchedInputs = inputPaths.filter(p => !usedInputPaths.has(p)); + const remainingSpecs = detectedSpecs.filter(s => + !results.some(r => r.spec === s && r.filePath) + ); + + // Only use this fallback if there's exactly one unmatched input and one remaining spec + if (unmatchedInputs.length === 1 && remainingSpecs.length === 1 && remainingSpecs[0] === detectedSpec) { + matchedPath = path.resolve(unmatchedInputs[0]); + matchMethod = 'singleRemaining'; + } + } + + // If still no match, report error + if (!matchedPath && !error) { + error = `Unable to reliably match spec with ID "${detectedSpec.specId}" to a source file. ` + + `Provide the source file explicitly as input, or ensure the spec file contains a unique identifier.`; + } + + if (matchedPath) { + usedInputPaths.add(matchedPath); + } + + results.push({ + spec: detectedSpec, + filePath: matchedPath, + matchMethod, + error, + }); + } + + return results; +} + // Run setMeta(); main(argv); @@ -80,30 +269,17 @@ async function main(argv) { const detectedSpecs = await detectTests({ config: resolverConfig }); if (detectedSpecs && detectedSpecs.length > 0) { - // Convert detected specs to the format expected by the builder - // For JSON/YAML files, the resolver doesn't set contentPath, so we need to - // map specs back to their source files using the input paths. + // Match detected specs to their source files using explicit metadata, + // then fallback to heuristics if needed + const matchedSpecs = matchSpecsToSourceFiles(detectedSpecs, inputPaths); - // If there's a 1:1 mapping between input JSON/YAML files and detected specs, - // we can associate them directly - const jsonYamlInputs = inputPaths.filter(p => { - const ext = path.extname(p).toLowerCase(); - return ext === '.json' || ext === '.yaml' || ext === '.yml'; - }); - - for (let i = 0; i < detectedSpecs.length; i++) { - const detectedSpec = detectedSpecs[i]; - - // Use contentPath if available (e.g., for markdown files) - // Otherwise, try to match with JSON/YAML input files - let filePath = detectedSpec.contentPath || null; + for (const matched of matchedSpecs) { + const { spec: detectedSpec, filePath, matchMethod, error } = matched; - if (!filePath && jsonYamlInputs.length === detectedSpecs.length) { - // 1:1 mapping - use the corresponding input file - filePath = jsonYamlInputs[i]; - } else if (!filePath && jsonYamlInputs.length === 1 && detectedSpecs.length === 1) { - // Single input file, single spec - use the input file - filePath = jsonYamlInputs[0]; + if (error) { + console.error(`\x1b[31mError: ${error}\x1b[0m`); + console.error('\x1b[33mPlease ensure each spec file is provided explicitly as input.\x1b[0m'); + process.exit(1); } const ext = filePath ? path.extname(filePath).toLowerCase() : '.json'; @@ -117,6 +293,7 @@ async function main(argv) { extension: ext, isValid: true, // detectTests only returns valid specs validationErrors: null, + matchMethod, // Track how the match was made for debugging }); } } diff --git a/resolver/src/utils.js b/resolver/src/utils.js index e3e2bde..4c5ff74 100644 --- a/resolver/src/utils.js +++ b/resolver/src/utils.js @@ -995,6 +995,8 @@ async function parseTests({ config, files }) { object: content, filePath: file, }); + // Set sourcePath to track origin file for JSON/YAML specs + content.sourcePath = path.resolve(file); specs.push(content); } else { // Process non-object @@ -1071,6 +1073,8 @@ async function parseTests({ config, files }) { object: spec, filePath: file, }); + // Set sourcePath to track origin file for non-JSON/YAML specs + spec.sourcePath = path.resolve(file); specs.push(spec); } } From 37d0caa6ca82aa8f559ce1d7a5311fff2fb6ba2d Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:52:54 -0800 Subject: [PATCH 26/90] Add hasEditorFlag function to check for editor command-line flags --- cli/src/index.js | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/cli/src/index.js b/cli/src/index.js index 54386bc..f0fc241 100755 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -14,7 +14,6 @@ const { argv } = require("node:process"); const path = require("path"); const fs = require("fs"); const crypto = require("crypto"); -const { validate } = require("doc-detective-common"); const { detectTests } = require("doc-detective-resolver"); const yaml = require("js-yaml"); @@ -210,11 +209,27 @@ function matchSpecsToSourceFiles(detectedSpecs, inputPaths) { setMeta(); main(argv); +/** + * Check if any argument in the array is an exact --editor or -e flag. + * Matches: '--editor', '-e', '--editor=', '-e=' + * Does NOT match substrings like '--editor-mode' or '--some-editor' + * @param {string[]} args - Array of command-line arguments + * @returns {boolean} True if an exact editor flag is found + */ +function hasEditorFlag(args) { + return args.some(arg => + arg === '--editor' || + arg === '-e' || + arg.startsWith('--editor=') || + arg.startsWith('-e=') + ); +} + // Run async function main(argv) { // Check for --editor flag first (before processing other args) const rawArgs = argv.slice(2); // Remove 'node' and script path - if (rawArgs.includes('--editor') || rawArgs.includes('-e')) { + if (hasEditorFlag(rawArgs)) { // Parse editor-specific options const outputDir = process.cwd(); @@ -284,14 +299,16 @@ async function main(argv) { const ext = filePath ? path.extname(filePath).toLowerCase() : '.json'; - // detectedSpec is already a valid spec_v3 object from detectTests + // detectedSpec is already a valid spec_v3 object from detectTests. + // The resolver validates specs against the spec_v3 schema and only + // returns specs that pass validation (invalid specs are logged and skipped). const spec = { ...detectedSpec }; specs.push({ spec, filePath, extension: ext, - isValid: true, // detectTests only returns valid specs + isValid: true, validationErrors: null, matchMethod, // Track how the match was made for debugging }); From 8f2984ae4005d0a80761ef42d1445d2cd2fce658 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 11:54:14 -0800 Subject: [PATCH 27/90] Enhance modelMap with OpenAI models and update default model identifier in options --- common/src/ai.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/common/src/ai.js b/common/src/ai.js index 23a6bcf..f0c5225 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -16,6 +16,11 @@ const modelMap = { "anthropic/claude-haiku-4.5": "claude-haiku-4-5", "anthropic/claude-sonnet-4.5": "claude-sonnet-4-5", "anthropic/claude-opus-4.5": "claude-opus-4-5", + // OpenAI models + "openai/gpt-4": "gpt-4", + "openai/gpt-4-turbo": "gpt-4-turbo", + "openai/gpt-4o": "gpt-4o", + "openai/gpt-3.5-turbo": "gpt-3.5-turbo", }; /** @@ -223,7 +228,7 @@ const toAiSdkSchema = (schema) => { * @param {string} [options.files[].type] - File type ("image"). * @param {string} [options.files[].data] - Base64 data or URL. * @param {string} [options.files[].mimeType] - MIME type (e.g., "image/png"). - * @param {string} [options.model] - Model identifier (default: "claude-3-5-haiku-latest"). + * @param {string} [options.model] - Model identifier (default: "anthropic/claude-haiku-4.5"). * @param {string} [options.system] - System message. * @param {z.ZodSchema | Object} [options.schema] - Zod schema or JSON schema for structured output. * @param {string} [options.schemaName] - Name for the schema (used in API calls). @@ -304,9 +309,12 @@ const generate = async ({ // Build messages or prompt if (messages && messages.length > 0) { - // Use messages array directly - generationOptions.messages = messages.map((msg) => { - if (msg.role === "user" && files && files.length > 0) { + // Find the index of the last user message + const lastUserIndex = messages.findLastIndex((msg) => msg.role === "user"); + + // Use messages array, attaching files only to the last user message + generationOptions.messages = messages.map((msg, index) => { + if (index === lastUserIndex && files && files.length > 0) { return { ...msg, content: buildMessageContent({ prompt: msg.content, files }), From 23ec3e1e5d799914981378fc3742658ea498f6fe Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:02:47 -0800 Subject: [PATCH 28/90] Refactor sourceFileUtils to use EXCLUDED_STEP_KEYS constant for better maintainability and simplify insertSourceContent function parameters --- cli/src/cli/builder/sourceFileUtils.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/cli/src/cli/builder/sourceFileUtils.js b/cli/src/cli/builder/sourceFileUtils.js index abdc503..7895836 100644 --- a/cli/src/cli/builder/sourceFileUtils.js +++ b/cli/src/cli/builder/sourceFileUtils.js @@ -12,6 +12,12 @@ const fs = require('fs'); const path = require('path'); const crypto = require('crypto'); +/** + * Step property names that are excluded when determining the action key or checking for simple serialization. + * These are common step metadata properties, not action-specific properties. + */ +const EXCLUDED_STEP_KEYS = ['stepId', 'description', 'unsafe', 'outputs', 'variables', 'breakpoint', '$schema']; + /** * Detect the syntax format used in an inline statement's original text. * @@ -45,7 +51,7 @@ function detectSyntaxFormat(originalText) { // Now detect the syntax format of the content // JSON: starts with { or contains "key": pattern - if (content.startsWith('{') || /^"?\w+"?\s*:\s*[{\["']/.test(content)) { + if (content.startsWith('{') || /^"?\w+"?\s*:\s*[{["']/.test(content)) { return 'json'; } @@ -159,7 +165,7 @@ function serializeStepToInline({ step, commentFormat, fileExtension, originalTex // Determine the step type (action key) const actionKey = Object.keys(stepToSerialize).find(key => - !['stepId', 'description', 'unsafe', 'outputs', 'variables', 'breakpoint', '$schema'].includes(key) + !EXCLUDED_STEP_KEYS.includes(key) ); if (!actionKey) { @@ -307,7 +313,7 @@ function canSerializeAsSimple(step, actionKey) { // Count properties that aren't the action or common step properties const nonActionKeys = Object.keys(step).filter(key => key !== actionKey && - !['stepId', 'description', 'unsafe', 'outputs', 'variables', 'breakpoint', '$schema'].includes(key) + !EXCLUDED_STEP_KEYS.includes(key) ); // If there are other non-common properties, can't use simple format @@ -478,14 +484,13 @@ function updateSourceContent({ filePath, startOffset, endOffset, newContent }) { * @param {string} options.filePath - Path to the file * @param {number} options.offset - Offset where to insert * @param {string} options.content - Content to insert - * @param {boolean} options.insertBefore - If true, insert before the offset position * @returns {Object} Result with success status */ -function insertSourceContent({ filePath, offset, content, insertBefore = false }) { +function insertSourceContent({ filePath, offset, content }) { return updateSourceContent({ filePath, - startOffset: insertBefore ? offset : offset, - endOffset: insertBefore ? offset : offset, + startOffset: offset, + endOffset: offset, newContent: content, }); } From 7a3845b65c3ec76f77c4e70dd55fdfdbcee1ff08 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:05:39 -0800 Subject: [PATCH 29/90] Add normalizeForComparison function for deterministic object comparison --- cli/src/cli/builder/sourceFileUtils.js | 50 +++++++++++++++++++------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/cli/src/cli/builder/sourceFileUtils.js b/cli/src/cli/builder/sourceFileUtils.js index 7895836..481e842 100644 --- a/cli/src/cli/builder/sourceFileUtils.js +++ b/cli/src/cli/builder/sourceFileUtils.js @@ -18,6 +18,37 @@ const crypto = require('crypto'); */ const EXCLUDED_STEP_KEYS = ['stepId', 'description', 'unsafe', 'outputs', 'variables', 'breakpoint', '$schema']; +/** + * Normalize an object for deterministic comparison by removing excluded keys + * and serializing with sorted object keys. + * + * @param {Object} obj - The object to normalize + * @param {Array} excludeKeys - Keys to exclude from the normalized object + * @returns {string} A deterministic JSON string representation for comparison + */ +function normalizeForComparison(obj, excludeKeys = []) { + if (obj === null || obj === undefined) { + return JSON.stringify(obj); + } + + const sortedStringify = (value) => { + if (value === null || value === undefined) { + return JSON.stringify(value); + } + if (Array.isArray(value)) { + return '[' + value.map(sortedStringify).join(',') + ']'; + } + if (typeof value === 'object') { + const sortedKeys = Object.keys(value).filter(k => !excludeKeys.includes(k)).sort(); + const pairs = sortedKeys.map(k => JSON.stringify(k) + ':' + sortedStringify(value[k])); + return '{' + pairs.join(',') + '}'; + } + return JSON.stringify(value); + }; + + return sortedStringify(obj); +} + /** * Detect the syntax format used in an inline statement's original text. * @@ -688,12 +719,9 @@ function prepareSourceUpdates({ spec, originalSpec }) { const testLoc = test.sourceLocation; if (testLoc?.isInline && testLoc.file) { // Check if test metadata was modified by comparing with original (excluding steps and sourceLocation) - const testMetadata = JSON.stringify(test, (key, value) => - key === 'sourceLocation' || key === 'steps' ? undefined : value - ); - const originalMetadata = originalTest ? JSON.stringify(originalTest, (key, value) => - key === 'sourceLocation' || key === 'steps' ? undefined : value - ) : null; + const excludeKeys = ['sourceLocation', 'steps']; + const testMetadata = normalizeForComparison(test, excludeKeys); + const originalMetadata = originalTest ? normalizeForComparison(originalTest, excludeKeys) : null; const wasModified = testMetadata !== originalMetadata; @@ -760,12 +788,9 @@ function prepareSourceUpdates({ spec, originalSpec }) { if (!loc?.isInline || !loc.file) continue; // Check if step was modified by comparing with original - const stepContent = JSON.stringify(step, (key, value) => - key === 'sourceLocation' ? undefined : value - ); - const originalContent = originalStep ? JSON.stringify(originalStep, (key, value) => - key === 'sourceLocation' ? undefined : value - ) : null; + const stepExcludeKeys = ['sourceLocation']; + const stepContent = normalizeForComparison(step, stepExcludeKeys); + const originalContent = originalStep ? normalizeForComparison(originalStep, stepExcludeKeys) : null; const wasModified = stepContent !== originalContent; @@ -857,4 +882,5 @@ module.exports = { isAutoDetectedStep, prepareSourceUpdates, hasAutoDetectedSteps, + normalizeForComparison, }; From abef96ade0303973270bd8ef504b278d71cd4a46 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:07:22 -0800 Subject: [PATCH 30/90] Refactor reportResults function to include config parameter for improved logging and result reporting --- cli/src/index.js | 2 +- cli/src/utils.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/index.js b/cli/src/index.js index f0fc241..14a31e6 100755 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -377,7 +377,7 @@ async function main(argv) { : await runTests(config); if (apiConfig) { - await reportResults({ apiConfig, results }); + await reportResults({ config, apiConfig, results }); } else { // Output results await outputResults(config, output, results, { diff --git a/cli/src/utils.js b/cli/src/utils.js index 0be6178..9bfa0e8 100644 --- a/cli/src/utils.js +++ b/cli/src/utils.js @@ -726,7 +726,7 @@ function registerReporter(name, reporterFunction) { // Export the registerReporter function exports.registerReporter = registerReporter; -async function reportResults({ apiConfig, results }) { +async function reportResults({ config = {}, apiConfig, results }) { // Transform results into the required format for the API // Extract contexts from the nested structure and format them const contexts = []; @@ -753,7 +753,7 @@ async function reportResults({ apiConfig, results }) { status = "skipped"; } if (!status) { - log(config, "error", `Unknown context result status for context ID ${contextId}`); + log(`Unknown context result status for context ID ${contextId}`, "error", config); return; } From 85653b8f49c36e252a5c5b7126b0619ae672949b Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:10:52 -0800 Subject: [PATCH 31/90] Refactor log function to accept config as the first parameter for improved logging consistency --- cli/src/utils.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cli/src/utils.js b/cli/src/utils.js index 9bfa0e8..461a7dc 100644 --- a/cli/src/utils.js +++ b/cli/src/utils.js @@ -18,7 +18,7 @@ exports.getResolvedTestsFromEnv = getResolvedTestsFromEnv; exports.reportResults = reportResults; // Log function that respects logLevel -function log(message, level = "info", config = {}) { +function log(config = {}, level = "info", message) { const logLevels = ["silent", "error", "warning", "info", "debug"]; const currentLevel = config.logLevel || "info"; const currentLevelIndex = logLevels.indexOf(currentLevel); @@ -86,14 +86,14 @@ async function getResolvedTestsFromEnv(config = {}) { // Validate the structure: { accountId, url, token, contextIds } if (!apiConfig.accountId || !apiConfig.url || !apiConfig.token || !apiConfig.contextIds) { log( - "Invalid DOC_DETECTIVE_API: must contain 'accountId', 'url', 'token', and 'contextIds' properties", + config, "error", - config + "Invalid DOC_DETECTIVE_API: must contain 'accountId', 'url', 'token', and 'contextIds' properties" ); process.exit(1); } - log(`CLI:Fetching resolved tests from ${apiConfig.url}/resolved-tests`, "debug", config); + log(config, "debug", `CLI:Fetching resolved tests from ${apiConfig.url}/resolved-tests`); // Make GET request to the specified URL with token in header const response = await axios.get(`${apiConfig.url}/resolved-tests`, { @@ -113,9 +113,9 @@ async function getResolvedTestsFromEnv(config = {}) { if (!validation.valid) { log( - "Invalid resolvedTests from API response. " + validation.errors, + config, "error", - config + "Invalid resolvedTests from API response. " + validation.errors ); process.exit(1); } @@ -132,15 +132,15 @@ async function getResolvedTestsFromEnv(config = {}) { } log( - `CLI:RESOLVED_TESTS:\n${JSON.stringify(resolvedTests, null, 2)}`, + config, "debug", - config + `CLI:RESOLVED_TESTS:\n${JSON.stringify(resolvedTests, null, 2)}` ); } catch (error) { log( - `Error fetching resolved tests from DOC_DETECTIVE_API: ${error.message}`, + config, "error", - config + `Error fetching resolved tests from DOC_DETECTIVE_API: ${error.message}` ); process.exit(1); } @@ -171,7 +171,7 @@ async function getConfigFromEnv() { process.exit(1); } - log(`CLI:ENV_CONFIG:\n${JSON.stringify(envConfig, null, 2)}`, "debug", envConfig); + log(envConfig, "debug", `CLI:ENV_CONFIG:\n${JSON.stringify(envConfig, null, 2)}`); } catch (error) { console.error( `Error parsing DOC_DETECTIVE_CONFIG environment variable: ${error.message}` @@ -753,7 +753,7 @@ async function reportResults({ config = {}, apiConfig, results }) { status = "skipped"; } if (!status) { - log(`Unknown context result status for context ID ${contextId}`, "error", config); + log(config, "error", `Unknown context result status for context ID ${contextId}`); return; } From 7176df002986f4c37ca6e6910485c5f33570f959 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:12:35 -0800 Subject: [PATCH 32/90] Refactor error handling in getConfigFromEnv and reportResults functions to use log for consistent logging --- cli/src/utils.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cli/src/utils.js b/cli/src/utils.js index 461a7dc..c808a88 100644 --- a/cli/src/utils.js +++ b/cli/src/utils.js @@ -164,16 +164,19 @@ async function getConfigFromEnv() { }); if (!envValidation.valid) { - console.error( - "Invalid config from DOC_DETECTIVE_CONFIG environment variable.", - envValidation.errors + log( + envConfig, + "error", + `Invalid config from DOC_DETECTIVE_CONFIG environment variable. ${envValidation.errors}` ); process.exit(1); } log(envConfig, "debug", `CLI:ENV_CONFIG:\n${JSON.stringify(envConfig, null, 2)}`); } catch (error) { - console.error( + log( + {}, + "error", `Error parsing DOC_DETECTIVE_CONFIG environment variable: ${error.message}` ); process.exit(1); @@ -775,8 +778,6 @@ async function reportResults({ config = {}, apiConfig, results }) { const url = `${apiConfig.url}/contexts`; const payload = { contexts }; - console.log(payload); - const response = await axios.post(url, payload, { headers: { "x-runner-token": apiConfig.token, From f54253ca84aa0777e416e4122ba8ef7fdeecf1af Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:50:11 -0800 Subject: [PATCH 33/90] Refactor App component to remove unused resolvedTests parameter and improve error message handling --- cli/src/cli/App.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/cli/App.mjs b/cli/src/cli/App.mjs index a6f6fbe..32ab71b 100644 --- a/cli/src/cli/App.mjs +++ b/cli/src/cli/App.mjs @@ -5,7 +5,7 @@ import Spinner from 'ink-spinner'; import TestRunner from './TestRunner.mjs'; import ResultsSummary from './ResultsSummary.mjs'; -const App = ({ config, resolvedTests, state }) => { +const App = ({ config, state }) => { return h(Box, { flexDirection: 'column', paddingY: 1 }, h(Box, { marginBottom: 1 }, h(Text, { bold: true, color: 'cyan' }, 'Doc Detective') @@ -31,7 +31,7 @@ const App = ({ config, resolvedTests, state }) => { state.phase === 'error' && h(Box, { flexDirection: 'column' }, h(Text, { color: 'red', bold: true }, '✖ Error'), - h(Text, { color: 'red' }, state.error) + h(Text, { color: 'red' }, state.error?.message || String(state.error)) ) ); }; From 5d59f047a5c7676fd14d4f15a96149944695483a Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:50:55 -0800 Subject: [PATCH 34/90] Refactor StepEditor component for improved structure and readability --- cli/src/cli/builder/StepEditor.mjs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cli/src/cli/builder/StepEditor.mjs b/cli/src/cli/builder/StepEditor.mjs index aacebc4..39c39e3 100644 --- a/cli/src/cli/builder/StepEditor.mjs +++ b/cli/src/cli/builder/StepEditor.mjs @@ -272,14 +272,14 @@ const StepEditor = ({ if (variant.type === 'string') { newValue = ''; } else if (variant.type === 'number' || variant.type === 'integer') { - newValue = variant.schema.default !== undefined ? variant.schema.default : 0; + newValue = variant.schema?.default !== undefined ? variant.schema.default : 0; } else if (variant.type === 'boolean') { - newValue = variant.schema.default !== undefined ? variant.schema.default : false; + newValue = variant.schema?.default !== undefined ? variant.schema.default : false; } else if (variant.type === 'object') { // Create object with required fields newValue = {}; - const required = variant.schema.required || []; - if (variant.schema.properties) { + const required = variant.schema?.required || []; + if (variant.schema?.properties) { Object.entries(variant.schema.properties).forEach(([key, prop]) => { if (required.includes(key)) { if (prop.default !== undefined) { @@ -332,9 +332,9 @@ const StepEditor = ({ if (variant.type === 'string') { defaultValue = ''; } else if (variant.type === 'number' || variant.type === 'integer') { - defaultValue = variant.schema.default !== undefined ? variant.schema.default : 0; + defaultValue = variant.schema?.default !== undefined ? variant.schema.default : 0; } else if (variant.type === 'boolean') { - defaultValue = variant.schema.default !== undefined ? variant.schema.default : false; + defaultValue = variant.schema?.default !== undefined ? variant.schema.default : false; } else { defaultValue = {}; } From cea535ca560ef86b52b577277538c7e181530ed7 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:54:50 -0800 Subject: [PATCH 35/90] Refactor inline source update handling to use useEffect for better control and cancellation --- cli/src/cli/builder/TestBuilder.mjs | 76 ++++++++++++++++++----------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index 53f55f2..c5a1117 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -703,37 +703,57 @@ const TestBuilder = ({ ); } - // Update inline sources - if (phase === 'inlineUpdate') { - // Use prepareSourceUpdates to handle both explicit inline steps and auto-detected steps - // Auto-detected steps will have new explicit comments inserted after the original content - const updatesByFile = prepareSourceUpdates({ spec, originalSpec }); - - // Apply updates to each file - const errors = []; - for (const [file, updates] of updatesByFile) { - const result = batchUpdateSourceContent({ filePath: file, updates }); - if (!result.success) { - errors.push(`${path.basename(file)}: ${result.error || 'Unknown error'}`); - } + // Effect to handle inline source updates when phase changes to 'inlineUpdate' + useEffect(() => { + if (phase !== 'inlineUpdate') { + return; } - - if (errors.length > 0) { - setInlineUpdateError(errors.join('\n')); - setPhase('inlineUpdateError'); - } else { - // Update hashes for modified files - const newHashes = { ...sourceFileHashes }; - for (const file of updatesByFile.keys()) { - const hash = getFileContentHash(file); - if (hash) { - newHashes[file] = hash; + + let cancelled = false; + + const performInlineUpdate = async () => { + // Use prepareSourceUpdates to handle both explicit inline steps and auto-detected steps + // Auto-detected steps will have new explicit comments inserted after the original content + const updatesByFile = prepareSourceUpdates({ spec, originalSpec }); + + // Apply updates to each file + const errors = []; + for (const [file, updates] of updatesByFile) { + if (cancelled) return; + const result = batchUpdateSourceContent({ filePath: file, updates }); + if (!result.success) { + errors.push(`${path.basename(file)}: ${result.error || 'Unknown error'}`); } } - setSourceFileHashes(newHashes); - setPhase('inlineUpdateSuccess'); - } - + + if (cancelled) return; + + if (errors.length > 0) { + setInlineUpdateError(errors.join('\n')); + setPhase('inlineUpdateError'); + } else { + // Update hashes for modified files + const newHashes = { ...sourceFileHashes }; + for (const file of updatesByFile.keys()) { + const hash = getFileContentHash(file); + if (hash) { + newHashes[file] = hash; + } + } + setSourceFileHashes(newHashes); + setPhase('inlineUpdateSuccess'); + } + }; + + performInlineUpdate(); + + return () => { + cancelled = true; + }; + }, [phase, spec, originalSpec, sourceFileHashes]); + + // Update inline sources - render only, no side effects + if (phase === 'inlineUpdate') { return React.createElement( Box, { flexDirection: 'column', padding: 1 }, From c31fab191af7fcb4728c2f5ce7273aa39488b087 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 12:57:23 -0800 Subject: [PATCH 36/90] Refactor pre-save inline source check to use useEffect for improved state management --- cli/src/cli/builder/TestBuilder.mjs | 39 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index c5a1117..47b5c19 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -571,27 +571,32 @@ const TestBuilder = ({ ); } - // Pre-save check for inline sources - if (phase === 'preSave') { + // Pre-save check for inline sources - handled by useEffect to avoid state updates during render + useEffect(() => { + if (phase !== 'preSave') return; + // Check if any inline source files have changed - const changed = []; - const inlineFiles = getInlineSourceFiles(spec); - for (const file of inlineFiles) { - const originalHash = sourceFileHashes[file]; - if (originalHash && hasSourceFileChanged(file, originalHash)) { - changed.push(file); - } - } + const changed = getInlineSourceFiles(spec).filter( + file => sourceFileHashes[file] && hasSourceFileChanged(file, sourceFileHashes[file]) + ); - if (changed.length > 0) { + // Determine the next phase + const nextPhase = changed.length > 0 + ? 'sourceChanged' + : (hasInlineSources ? 'inlineSaveChoice' : 'save'); + + // Only update if changed files differ from current + const changedFilesMatch = + changed.length === changedSourceFiles.length && + changed.every((file, i) => changedSourceFiles[i] === file); + + if (!changedFilesMatch) { setChangedSourceFiles(changed); - setPhase('sourceChanged'); - } else if (hasInlineSources) { - setPhase('inlineSaveChoice'); - } else { - setPhase('save'); } - + setPhase(nextPhase); + }, [phase, spec, sourceFileHashes, hasInlineSources, changedSourceFiles]); + + if (phase === 'preSave') { return React.createElement( Box, { flexDirection: 'column', padding: 1 }, From 4eb1e65cff07b82d9b91f6bc41f085123987ec9b Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:02:05 -0800 Subject: [PATCH 37/90] Refactor runWithUI to improve state flushing and error handling --- cli/src/cli/runner.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cli/src/cli/runner.js b/cli/src/cli/runner.js index 161c05c..ebda73f 100644 --- a/cli/src/cli/runner.js +++ b/cli/src/cli/runner.js @@ -68,8 +68,13 @@ async function runWithUI(config, options = {}) { results, })); - // Wait a bit to show the results before unmounting - await new Promise((resolve) => setTimeout(resolve, 100)); + // Wait for React to flush the completed state to the screen + // Uses requestAnimationFrame to ensure the paint cycle completes + await new Promise((resolve) => { + requestAnimationFrame(() => { + requestAnimationFrame(resolve); + }); + }); // Unmount the app if (appInstance) { @@ -82,7 +87,7 @@ async function runWithUI(config, options = {}) { updateState((prev) => ({ ...prev, phase: 'error', - error: error.message, + error: error.message ? error : new Error(String(error)), })); // Wait a bit to show the error before unmounting From a3c22591f0cfd69df77e06976bd7eb5d647c42dd Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:24:06 -0800 Subject: [PATCH 38/90] Refactor API endpoint handling and test configuration for improved clarity and functionality --- cli/test/resolvedTests.test.js | 39 +++++++++++++------------- cli/test/server/index.js | 50 ++++++++++++++++++---------------- core/src/tests.js | 8 +++++- 3 files changed, 52 insertions(+), 45 deletions(-) diff --git a/cli/test/resolvedTests.test.js b/cli/test/resolvedTests.test.js index 2e2a882..7107529 100644 --- a/cli/test/resolvedTests.test.js +++ b/cli/test/resolvedTests.test.js @@ -38,7 +38,7 @@ describe("DOC_DETECTIVE_API environment variable", function () { it("Should fetch and run resolved tests from API", async () => { const apiConfig = { accountId: "test-account", - url: "http://localhost:8093/api/resolved-tests", + url: "http://localhost:8093/api", token: "test-token-123", contextIds: "test-context", }; @@ -112,7 +112,7 @@ describe("DOC_DETECTIVE_API environment variable", function () { it("Should reject unauthorized API requests", async () => { const apiConfigBadToken = { accountId: "test-account", - url: "http://localhost:8093/api/resolved-tests", + url: "http://localhost:8093/api", token: "wrong-token", contextIds: "test-context", }; @@ -140,7 +140,7 @@ describe("DOC_DETECTIVE_API environment variable", function () { it("Should apply config overrides from DOC_DETECTIVE_CONFIG to API-fetched tests", async () => { const apiConfig = { accountId: "test-account", - url: "http://localhost:8093/api/resolved-tests", + url: "http://localhost:8093/api", token: "test-token-123", contextIds: "test-context", }; @@ -155,27 +155,26 @@ describe("DOC_DETECTIVE_API environment variable", function () { process.env.DOC_DETECTIVE_CONFIG = JSON.stringify(configOverride); try { - await spawnCommand( - `node ./src/index.js -o ${outputFile}` + const result = await spawnCommand( + `node ./src/index.js` ); - // Wait until the file is written - let waitCount = 0; - while (!fs.existsSync(outputFile) && waitCount < 50) { - await new Promise((resolve) => setTimeout(resolve, 100)); - waitCount++; - } + // Assert the command exited successfully + assert.strictEqual(result.exitCode, 0, `Command should exit with code 0, got ${result.exitCode}. stderr: ${result.stderr}`); - if (fs.existsSync(outputFile)) { - const testResult = require(outputFile); - // Clean up the require cache - delete require.cache[require.resolve(outputFile)]; - fs.unlinkSync(outputFile); + // Verify that the DOC_DETECTIVE_CONFIG override (logLevel: "debug") was applied + // When logLevel is set to debug, the CLI outputs debug logs including "CLI:RESOLVED_TESTS" + // Note: When DOC_DETECTIVE_API is set, results are POSTed to the API, not written to a file + assert.ok( + result.stdout.includes("CLI:RESOLVED_TESTS") || result.stdout.includes("CLI:CONFIG"), + `Debug log output should be present when logLevel is set to 'debug'. stdout: ${result.stdout.substring(0, 500)}` + ); - // Check that tests were run - assert.ok(testResult.summary); - assert.ok(testResult.specs); - } + // Verify the resolved tests output includes the merged config with logLevel: "debug" + assert.ok( + result.stdout.includes('"logLevel": "debug"') || result.stdout.includes('"logLevel":"debug"'), + `Resolved tests output should show logLevel: "debug" from the config override. stdout: ${result.stdout.substring(0, 1000)}` + ); } finally { // Restore original env if (originalApiEnv !== undefined) { diff --git a/cli/test/server/index.js b/cli/test/server/index.js index 9a78d3b..2c07c98 100644 --- a/cli/test/server/index.js +++ b/cli/test/server/index.js @@ -30,31 +30,8 @@ function createServer(options = {}) { app.use(express.static(staticDir)); } - // Echo API endpoint that returns the request body - app.all("/api/:path", (req, res) => { - try { - const requestBody = req.method === "GET" ? req.query : req.body; - const modifiedResponse = modifyResponse(req, requestBody); - console.log("Request:", { - Method: req.method, - Path: req.path, - Query: req.query, - Headers: req.headers, - Body: req.body, - }); - - res.set("x-server", "doc-detective-echo-server"); - - console.log("Response:", { Body: modifiedResponse }); - - res.json(modifiedResponse); - } catch (error) { - console.error("Error processing request:", error); - res.status(500).json({ error: "Internal server error" }); - } - }); - // Endpoint for testing DOC_DETECTIVE_API - returns resolved tests + // NOTE: This specific route MUST be defined before the wildcard /api/:path route app.get("/api/resolved-tests", (req, res) => { try { // Check for x-runner-token header @@ -100,6 +77,31 @@ function createServer(options = {}) { } }); + // Echo API endpoint that returns the request body + // NOTE: This wildcard route must be defined AFTER specific /api/* routes + app.all("/api/:path", (req, res) => { + try { + const requestBody = req.method === "GET" ? req.query : req.body; + const modifiedResponse = modifyResponse(req, requestBody); + console.log("Request:", { + Method: req.method, + Path: req.path, + Query: req.query, + Headers: req.headers, + Body: req.body, + }); + + res.set("x-server", "doc-detective-echo-server"); + + console.log("Response:", { Body: modifiedResponse }); + + res.json(modifiedResponse); + } catch (error) { + console.error("Error processing request:", error); + res.status(500).json({ error: "Internal server error" }); + } + }); + return { /** * Start the server diff --git a/core/src/tests.js b/core/src/tests.js index 5787966..795109a 100644 --- a/core/src/tests.js +++ b/core/src/tests.js @@ -367,9 +367,15 @@ async function runSpecs({ resolvedTests }) { const config = resolvedTests.config; const specs = resolvedTests.specs; + // Ensure config.environment is set for getAvailableApps + // This is needed when resolvedTests comes from an external source (e.g., API) + if (!config.environment) { + config.environment = getEnvironment(); + } + // Get runner details const runnerDetails = { - environment: getEnvironment(), + environment: config.environment, availableApps: await getAvailableApps({ config }), allowUnsafeSteps: await allowUnsafeSteps({ config }), }; From cf1149228bf132c27d4f63196a4823f02f844a99 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:36:33 -0800 Subject: [PATCH 39/90] Refactor resolved tests to validate API execution results from stdout instead of file output --- cli/test/resolvedTests.test.js | 53 ++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/cli/test/resolvedTests.test.js b/cli/test/resolvedTests.test.js index 7107529..95e689f 100644 --- a/cli/test/resolvedTests.test.js +++ b/cli/test/resolvedTests.test.js @@ -48,31 +48,40 @@ describe("DOC_DETECTIVE_API environment variable", function () { process.env.DOC_DETECTIVE_API = JSON.stringify(apiConfig); try { - const result = await spawnCommand( - `node ./src/index.js -o ${outputFile}` + // Note: When DOC_DETECTIVE_API is set, results are POSTed to the API, not written to a file + // So we don't pass -o flag and instead check stdout for execution results + const result = await spawnCommand(`node ./src/index.js`); + + // Assert spawnCommand exited successfully + assert.strictEqual( + result.exitCode, + 0, + `Command should exit with code 0, got ${result.exitCode}. stderr: ${result.stderr}` ); - // Wait until the file is written - let waitCount = 0; - while (!fs.existsSync(outputFile) && waitCount < 50) { - await new Promise((resolve) => setTimeout(resolve, 100)); - waitCount++; - } + // Validate that tests were executed by checking for results summary output + // The CLI outputs a summary with spec/test/step counts + assert.ok( + result.stdout.includes("Specs:") || result.stdout.includes("specs"), + `Output should contain test results summary. stdout: ${result.stdout.substring(0, 1000)}` + ); - if (fs.existsSync(outputFile)) { - const testResult = require(outputFile); - console.log( - "API Result summary:", - JSON.stringify(testResult.summary, null, 2) - ); - // Clean up the require cache - delete require.cache[require.resolve(outputFile)]; - fs.unlinkSync(outputFile); - - // Check that tests were run - assert.ok(testResult.summary); - assert.ok(testResult.specs); - } + // Validate the output includes test counts + assert.ok( + result.stdout.includes("Passed:") || + result.stdout.includes("passed") || + result.stdout.includes("pass"), + `Output should contain pass/fail information. stdout: ${result.stdout.substring(0, 1000)}` + ); + + // Validate that the checkLink step from the mock API was executed + // The mock server returns a spec with a checkLink step to localhost:8093 + assert.ok( + result.stdout.includes("Steps:") || + result.stdout.includes("steps") || + result.stdout.includes("checkLink"), + `Output should indicate step execution. stdout: ${result.stdout.substring(0, 1000)}` + ); } finally { // Restore original env if (originalEnv !== undefined) { From 57132492da6b7bfe98df24d0d5d7a4ab3fa09e4b Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:38:19 -0800 Subject: [PATCH 40/90] Refactor version bump logic to streamline patch version increment --- cli/scripts/bump-sync-version-core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/scripts/bump-sync-version-core.js b/cli/scripts/bump-sync-version-core.js index 3aa9da5..5fe86e9 100755 --- a/cli/scripts/bump-sync-version-core.js +++ b/cli/scripts/bump-sync-version-core.js @@ -70,11 +70,11 @@ function main() { console.log(`Version mismatch detected. Setting version to: ${newVersion}`); } else { // Project version is already equal or greater than core version, just bump patch + newVersion = `${projMajor}.${projMinor}.${projPatch + 1}`; console.log( "Project version is current or ahead. Bumping patch version to:", newVersion ); - newVersion = `${projMajor}.${projMinor}.${projPatch + 1}`; } // Validate the new version before setting it From 744e976fa62ed85d2f87dabf7e4de516c221af3d Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:42:15 -0800 Subject: [PATCH 41/90] typo --- cli/src/cli/ResultsSummary.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/cli/ResultsSummary.mjs b/cli/src/cli/ResultsSummary.mjs index f2086f5..c5e6391 100644 --- a/cli/src/cli/ResultsSummary.mjs +++ b/cli/src/cli/ResultsSummary.mjs @@ -15,7 +15,7 @@ const ResultsSummary = ({ results, config }) => { const totalSpecs = specs ? specs.pass + specs.fail + specs.warning + specs.skipped : 0; const totalTests = tests ? tests.pass + tests.fail + tests.warning + tests.skipped : 0; const totalContexts = contexts ? contexts.pass + contexts.fail + contexts.warning + contexts.skipped : 0; - const totalSteps = steps ? steps.pass + steps.fail + steps.warning + specs.skipped : 0; + const totalSteps = steps ? steps.pass + steps.fail + steps.warning + steps.skipped : 0; // Check for failures const hasFailures = From 0a59f4ec932f85c6111b9afc97d26a07eb2bdb8f Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:45:04 -0800 Subject: [PATCH 42/90] Refactor SpecSelector to handle TestBuilder import errors and improve user feedback --- cli/src/cli/builder/SpecSelector.mjs | 50 +++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/cli/src/cli/builder/SpecSelector.mjs b/cli/src/cli/builder/SpecSelector.mjs index 0b41d6d..0841cba 100644 --- a/cli/src/cli/builder/SpecSelector.mjs +++ b/cli/src/cli/builder/SpecSelector.mjs @@ -6,7 +6,7 @@ import React from 'react'; const { useState, useEffect } = React; -import { Box, Text, useApp } from 'ink'; +import { Box, Text, useApp, useInput } from 'ink'; import * as path from 'path'; import { ScrollableSelect, NoIndicator } from './components.mjs'; @@ -20,13 +20,20 @@ const SpecSelector = ({ specs, outputDir }) => { const { exit } = useApp(); const [selectedSpec, setSelectedSpec] = useState(null); const [TestBuilder, setTestBuilder] = useState(null); + const [importError, setImportError] = useState(null); // Dynamically import TestBuilder when a spec is selected useEffect(() => { if (selectedSpec) { - import('./TestBuilder.mjs').then(module => { - setTestBuilder(() => module.default); - }); + import('./TestBuilder.mjs') + .then(module => { + setTestBuilder(() => module.default); + }) + .catch(error => { + console.error('Failed to load TestBuilder:', error); + setImportError(error); + setTestBuilder(null); + }); } }, [selectedSpec]); @@ -34,8 +41,43 @@ const SpecSelector = ({ specs, outputDir }) => { const handleBack = () => { setSelectedSpec(null); setTestBuilder(null); + setImportError(null); }; + // Handle key press to go back from error state + useInput(() => { + if (importError) { + handleBack(); + } + }, { isActive: !!importError }); + + // Show error state if TestBuilder import failed + if (selectedSpec && importError) { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement( + Text, + { color: 'red', bold: true }, + '❌ Failed to load editor' + ), + React.createElement( + Text, + { color: 'gray' }, + importError.message || 'An unknown error occurred' + ), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement( + Text, + { color: 'cyan' }, + 'Press any key to go back...' + ) + ) + ); + } + // If a spec is selected and TestBuilder is loaded, render the TestBuilder if (selectedSpec && TestBuilder) { return React.createElement(TestBuilder, { From 771ab9ce0cd39dead53a94eda931974d816bf22b Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:46:54 -0800 Subject: [PATCH 43/90] Fix error handling in runBuilder to ensure terminal is cleared on rejection --- cli/src/cli/builder/builderRunner.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cli/src/cli/builder/builderRunner.js b/cli/src/cli/builder/builderRunner.js index 9cc2f70..c7909e3 100644 --- a/cli/src/cli/builder/builderRunner.js +++ b/cli/src/cli/builder/builderRunner.js @@ -72,6 +72,10 @@ async function runBuilder(options = {}) { // Clear screen on exit for clean terminal process.stdout.write('\x1b[2J\x1b[H'); resolve(); + }).catch((err) => { + // Clear screen on error for clean terminal + process.stdout.write('\x1b[2J\x1b[H'); + reject(err); }); } catch (error) { reject(error); From df193e8eec8a322cb7578aa9fc6a0ec00815c2dc Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:47:01 -0800 Subject: [PATCH 44/90] Refactor components for improved readability and maintainability --- cli/src/cli/builder/components.mjs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cli/src/cli/builder/components.mjs b/cli/src/cli/builder/components.mjs index a3c3979..02398a0 100644 --- a/cli/src/cli/builder/components.mjs +++ b/cli/src/cli/builder/components.mjs @@ -66,6 +66,11 @@ export const ScrollableSelect = ({ const { stdout } = useStdout(); const [selectedIndex, setSelectedIndex] = useState(initialIndex); + // Sync local state when initialIndex prop changes + useEffect(() => { + setSelectedIndex(initialIndex); + }, [initialIndex]); + // Calculate visible items based on terminal height const terminalHeight = stdout?.rows || 24; const availableLines = Math.max(terminalHeight - reservedLines, linesPerItem); From e5a447a57e2d469ca4cc2bff711aa1d4e28fbfe2 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:49:39 -0800 Subject: [PATCH 45/90] Add waitForCondition and waitForText functions to enhance test synchronization --- cli/test/builder/DebugRunner.test.mjs | 62 ++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/cli/test/builder/DebugRunner.test.mjs b/cli/test/builder/DebugRunner.test.mjs index 401c188..6615b70 100644 --- a/cli/test/builder/DebugRunner.test.mjs +++ b/cli/test/builder/DebugRunner.test.mjs @@ -29,6 +29,39 @@ before(async function () { global.expect = expect; }); +/** + * Polls until a condition is met or timeout is reached. + * @param {() => boolean} conditionFn - Function that returns true when condition is met + * @param {object} options - Polling options + * @param {number} options.timeout - Maximum time to wait in ms (default: 2000) + * @param {number} options.interval - Polling interval in ms (default: 20) + * @returns {Promise} Resolves when condition is met, rejects on timeout + */ +const waitForCondition = async (conditionFn, { timeout = 2000, interval = 20 } = {}) => { + const startTime = Date.now(); + while (Date.now() - startTime < timeout) { + if (conditionFn()) { + return; + } + await new Promise(resolve => setTimeout(resolve, interval)); + } + throw new Error(`waitForCondition timed out after ${timeout}ms`); +}; + +/** + * Waits for the rendered frame to contain specific text. + * @param {() => string} lastFrameFn - Function that returns the current frame + * @param {string} text - Text to wait for + * @param {object} options - Polling options + * @returns {Promise} + */ +const waitForText = async (lastFrameFn, text, options = {}) => { + await waitForCondition(() => { + const frame = lastFrameFn(); + return frame && frame.includes(text); + }, options); +}; + describe('DebugRunner component', function () { // Store original require for stubbing let coreModule; @@ -96,8 +129,8 @@ describe('DebugRunner component', function () { }) ); - // Wait for async initialization - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for component to show navigation warning + await waitForText(lastFrame, 'Navigation'); const frame = lastFrame(); expect(frame).to.include('Navigation'); @@ -130,8 +163,8 @@ describe('DebugRunner component', function () { }) ); - // Wait for async initialization - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for step preview to render + await waitForText(lastFrame, 'Step 1'); const frame = lastFrame(); expect(frame).to.include('Step 1'); @@ -163,7 +196,8 @@ describe('DebugRunner component', function () { }) ); - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for step info to render + await waitForText(lastFrame, 'goTo'); const frame = lastFrame(); expect(frame).to.include('goTo'); @@ -194,7 +228,8 @@ describe('DebugRunner component', function () { }) ); - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for menu options to render + await waitForText(lastFrame, 'Run this step'); const frame = lastFrame(); expect(frame).to.include('Run this step'); @@ -224,7 +259,8 @@ describe('DebugRunner component', function () { }) ); - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for menu options to render + await waitForText(lastFrame, 'Edit step'); const frame = lastFrame(); expect(frame).to.include('Edit step'); @@ -254,7 +290,8 @@ describe('DebugRunner component', function () { }) ); - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for menu options to render + await waitForText(lastFrame, 'Stop debug'); const frame = lastFrame(); expect(frame).to.include('Stop debug'); @@ -288,7 +325,8 @@ describe('DebugRunner component', function () { }) ); - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for step count to render + await waitForText(lastFrame, '1/3'); const frame = lastFrame(); expect(frame).to.include('1/3'); @@ -312,7 +350,8 @@ describe('DebugRunner component', function () { }) ); - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for error message to render + await waitForText(lastFrame, 'Error'); const frame = lastFrame(); expect(frame).to.include('Error'); @@ -345,7 +384,8 @@ describe('DebugRunner component', function () { }) ); - await new Promise(resolve => setTimeout(resolve, 50)); + // Wait for progress tracking to render + await waitForText(lastFrame, 'passed'); const frame = lastFrame(); expect(frame).to.include('passed'); From 64d6bcea2de9ba30d97fc37fb7d95a718ccc4d01 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:52:02 -0800 Subject: [PATCH 46/90] Enhance validation display in StepEditor tests to show specific error messages and save option based on step validity --- cli/test/builder/StepEditor.test.mjs | 39 +++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/cli/test/builder/StepEditor.test.mjs b/cli/test/builder/StepEditor.test.mjs index 408c17f..fcd13c2 100644 --- a/cli/test/builder/StepEditor.test.mjs +++ b/cli/test/builder/StepEditor.test.mjs @@ -305,11 +305,12 @@ describe('StepEditor component', function () { }); describe('validation display', function () { - it('shows warning for step with validation errors', function () { - // A step with an unrecognized action type would fail validation - // but we need a step type to display the menu, so we create an invalid value instead + it('shows warning message when step has validation errors', function () { + // Create a step with an invalid value that will fail schema validation + // An empty object for goTo is invalid since goTo requires either a string URL + // or an object with required 'url' property const step = { - goTo: { url: '' }, // Empty required field might fail validation + goTo: { url: '' }, // Empty required field fails validation }; const { lastFrame } = render( React.createElement(StepEditor, { @@ -320,9 +321,33 @@ describe('StepEditor component', function () { ); const frame = lastFrame(); - // The step might show validation warning or "Fix errors" message - // depending on schema validation - expect(frame).to.include('goTo'); + // StepEditor shows these specific messages when validation.valid is false: + // 1. A warning banner: '⚠️ Step has validation errors' + // 2. A menu item: '⚠️ Fix errors before saving' (instead of 'Save step') + expect(frame).to.include('Step has validation errors'); + expect(frame).to.include('Fix errors before saving'); + // Additionally, the 'Save step' option should NOT appear when invalid + expect(frame).to.not.include('Save step'); + }); + + it('shows save option when step is valid', function () { + const step = { + goTo: 'https://example.com', // Valid URL format + }; + const { lastFrame } = render( + React.createElement(StepEditor, { + step, + stepIndex: 0, + ...noopCallbacks, + }) + ); + + const frame = lastFrame(); + // When validation passes, 'Save step' should appear + expect(frame).to.include('Save step'); + // And the error messages should NOT appear + expect(frame).to.not.include('Step has validation errors'); + expect(frame).to.not.include('Fix errors before saving'); }); }); From 8232ffc84b99b4487996ac338e5c0793080da582 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 13:59:54 -0800 Subject: [PATCH 47/90] Refactor TestBuilder tests for improved structure and clarity --- cli/test/builder/TestBuilder.test.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/test/builder/TestBuilder.test.mjs b/cli/test/builder/TestBuilder.test.mjs index bd2b69e..a4c2445 100644 --- a/cli/test/builder/TestBuilder.test.mjs +++ b/cli/test/builder/TestBuilder.test.mjs @@ -54,7 +54,7 @@ describe('TestBuilder component', function () { after(function () { // Remove temp directory if (fs.existsSync(tempDir)) { - fs.rmdirSync(tempDir); + fs.rmSync(tempDir, { recursive: true, force: true }); } }); From 497b57b778facdaa3bd0686feaac07b9c88b1bcc Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 14:22:37 -0800 Subject: [PATCH 48/90] Refactor test files to remove unnecessary require statements and improve offset calculations in utils --- cli/test/builder/TestEditor.test.mjs | 4 -- cli/test/builder/editor.test.mjs | 2 +- cli/test/builder/fixtures.mjs | 4 -- cli/test/builder/schemaUtils.test.mjs | 16 +++---- resolver/src/utils.js | 60 +++++++++++++++++++++------ 5 files changed, 56 insertions(+), 30 deletions(-) diff --git a/cli/test/builder/TestEditor.test.mjs b/cli/test/builder/TestEditor.test.mjs index 1ac023c..5f95dc6 100644 --- a/cli/test/builder/TestEditor.test.mjs +++ b/cli/test/builder/TestEditor.test.mjs @@ -6,10 +6,6 @@ import React from 'react'; import { render } from 'ink-testing-library'; -import { createRequire } from 'module'; - -const require = createRequire(import.meta.url); - import TestEditor from '../../src/cli/builder/TestEditor.mjs'; import { getMockTest, diff --git a/cli/test/builder/editor.test.mjs b/cli/test/builder/editor.test.mjs index 7e6a565..e4d76f7 100644 --- a/cli/test/builder/editor.test.mjs +++ b/cli/test/builder/editor.test.mjs @@ -69,7 +69,7 @@ const spawnWithTimeout = async (args, options = {}) => { child.on('error', (err) => { clearTimeout(timer); - resolve({ stdout, stderr, exitCode: 1, error: err.message }); + resolve({ stdout, stderr, exitCode: null, error: err.message }); }); }); }; diff --git a/cli/test/builder/fixtures.mjs b/cli/test/builder/fixtures.mjs index c90bd19..c88f82e 100644 --- a/cli/test/builder/fixtures.mjs +++ b/cli/test/builder/fixtures.mjs @@ -5,10 +5,6 @@ * accepting optional partial overrides following the project pattern. */ -import { createRequire } from 'module'; -const require = createRequire(import.meta.url); -const { schemas } = require('doc-detective-common'); - /** * Create a mock spec object with sensible defaults. * @param {Object} overrides - Optional partial overrides diff --git a/cli/test/builder/schemaUtils.test.mjs b/cli/test/builder/schemaUtils.test.mjs index f018ef7..e859e38 100644 --- a/cli/test/builder/schemaUtils.test.mjs +++ b/cli/test/builder/schemaUtils.test.mjs @@ -41,6 +41,14 @@ import { stepRequiresBrowser, } from '../../src/cli/builder/schemaUtils.mjs'; +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + describe('schemaUtils', function () { describe('getStepTypes', function () { it('returns an array of step type names', function () { @@ -566,11 +574,3 @@ describe('schemaUtils', function () { }); }); }); - -// Use dynamic import for chai to support ESM -let expect; -before(async function () { - const chai = await import('chai'); - expect = chai.expect; - global.expect = expect; -}); diff --git a/resolver/src/utils.js b/resolver/src/utils.js index 4c5ff74..339f4a0 100644 --- a/resolver/src/utils.js +++ b/resolver/src/utils.js @@ -49,36 +49,70 @@ function isRelativeUrl(url) { * @returns {Object} Object with startLine, endLine, startColumn, endColumn */ function calculateLineColumn(content, startOffset, endOffset) { + // Validate and normalize offsets + let start = Math.max(0, startOffset); + let end = Math.max(0, endOffset); + + // Swap if start > end + if (start > end) { + [start, end] = [end, start]; + } + + // Clamp to content length + start = Math.min(start, content.length); + end = Math.min(end, content.length); + let startLine = 1; let startColumn = 1; let endLine = 1; let endColumn = 1; let currentOffset = 0; + let startFound = false; + let endFound = false; const lines = content.split('\n'); for (let i = 0; i < lines.length; i++) { - const lineLength = lines[i].length + 1; // +1 for the newline character + const isLastLine = i === lines.length - 1; + // Only add 1 for newline if this line actually has a trailing newline (not the last line) + const hasNewline = !isLastLine; + const lineLength = lines[i].length + (hasNewline ? 1 : 0); const lineEnd = currentOffset + lineLength; + // For the last line, lineEnd should equal content.length + const effectiveLineEnd = isLastLine ? content.length : lineEnd; - // Check if startOffset falls within this line - if (startOffset >= currentOffset && startOffset < lineEnd) { - startLine = i + 1; - startColumn = startOffset - currentOffset + 1; + // Check if start falls within this line: [currentOffset, effectiveLineEnd) + // For last line, use <= to include EOF position + if (!startFound) { + const startInLine = isLastLine + ? (start >= currentOffset && start <= effectiveLineEnd) + : (start >= currentOffset && start < effectiveLineEnd); + if (startInLine) { + startLine = i + 1; + startColumn = start - currentOffset + 1; + startFound = true; + } } - // Check if endOffset falls within this line - if (endOffset >= currentOffset && endOffset <= lineEnd) { - endLine = i + 1; - endColumn = endOffset - currentOffset + 1; + // Check if end falls within this line: [currentOffset, effectiveLineEnd) + // For last line, use <= to include EOF position + if (!endFound) { + const endInLine = isLastLine + ? (end >= currentOffset && end <= effectiveLineEnd) + : (end >= currentOffset && end < effectiveLineEnd); + if (endInLine) { + endLine = i + 1; + endColumn = end - currentOffset + 1; + endFound = true; + } } - currentOffset = lineEnd; - - // If we've passed both offsets, we can stop - if (currentOffset > endOffset) { + // Break when both offsets have been located + if (startFound && endFound) { break; } + + currentOffset = lineEnd; } return { startLine, endLine, startColumn, endColumn }; From 7eeeff1881812127825a5294ecef9727a3b4f730 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 14:28:36 -0800 Subject: [PATCH 49/90] Update modelMap to include new OpenAI GPT-5 models and remove outdated entries --- common/src/ai.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common/src/ai.js b/common/src/ai.js index f0c5225..370cc5d 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -17,10 +17,9 @@ const modelMap = { "anthropic/claude-sonnet-4.5": "claude-sonnet-4-5", "anthropic/claude-opus-4.5": "claude-opus-4-5", // OpenAI models - "openai/gpt-4": "gpt-4", - "openai/gpt-4-turbo": "gpt-4-turbo", - "openai/gpt-4o": "gpt-4o", - "openai/gpt-3.5-turbo": "gpt-3.5-turbo", + "openai/gpt-5.1": "gpt-5.1", + "openai/gpt-5-mini": "gpt-5-mini", + "openai/gpt-5-nano": "gpt-5-nano", }; /** From bbd692bf15bb678a46d2f13a2eaa1457d7d3e102 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 14:29:55 -0800 Subject: [PATCH 50/90] Formatting --- cli/samples/kitten-search.spec.json | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cli/samples/kitten-search.spec.json b/cli/samples/kitten-search.spec.json index 37f9339..ac4383a 100644 --- a/cli/samples/kitten-search.spec.json +++ b/cli/samples/kitten-search.spec.json @@ -10,12 +10,9 @@ { "find": { "selector": "#searchbox_input", - "click": "true", + "click": true, "type": { - "keys": [ - "American Shorthair kittens", - "$ENTER$" - ] + "keys": ["American Shorthair kittens", "$ENTER$"] } }, "variables": {} @@ -38,4 +35,4 @@ } ], "specId": "02db96fc-7912-4eb6-ad79-9c96c2f1f8db" -} \ No newline at end of file +} From fe846b7cfa7a28b9bdc03dd17bcc50a8cdf25cff Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 15:01:34 -0800 Subject: [PATCH 51/90] Implement truncateGraphemeSafe function for string truncation and update display logic in DebugRunner --- cli/src/cli/builder/DebugRunner.mjs | 40 +++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/cli/src/cli/builder/DebugRunner.mjs b/cli/src/cli/builder/DebugRunner.mjs index d3bfa6a..61dc488 100644 --- a/cli/src/cli/builder/DebugRunner.mjs +++ b/cli/src/cli/builder/DebugRunner.mjs @@ -21,6 +21,42 @@ import { stepRequiresBrowser, } from './schemaUtils.mjs'; +/** + * Truncate a string to a maximum number of grapheme clusters (user-perceived characters). + * Uses Intl.Segmenter if available (Node 16+), otherwise falls back to Array.from for code-point safety. + * @param {string} str - The string to truncate + * @param {number} maxLength - Maximum number of grapheme clusters + * @param {string} [ellipsis='…'] - Ellipsis to append if truncated + * @returns {string} The truncated string + */ +function truncateGraphemeSafe(str, maxLength, ellipsis = '…') { + if (typeof str !== 'string' || str.length === 0) { + return ''; + } + + // Use Intl.Segmenter if available (Node 16+) + if (typeof Intl !== 'undefined' && Intl.Segmenter) { + const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' }); + const segments = [...segmenter.segment(str)]; + + if (segments.length <= maxLength) { + return str; + } + + const truncated = segments.slice(0, maxLength).map(s => s.segment).join(''); + return truncated + ellipsis; + } + + // Fallback: use Array.from for code-point safety + const codePoints = Array.from(str); + + if (codePoints.length <= maxLength) { + return str; + } + + return codePoints.slice(0, maxLength).join('') + ellipsis; +} + /** * Find the index of the first browser-requiring step * @param {Array} steps - Array of steps @@ -223,9 +259,9 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { const actionType = getStepActionType(step); const actionValue = actionType ? step[actionType] : null; const displayValue = typeof actionValue === 'string' - ? actionValue.substring(0, 50) + ? truncateGraphemeSafe(actionValue, 50) : typeof actionValue === 'object' - ? JSON.stringify(actionValue).substring(0, 50) + ? truncateGraphemeSafe(JSON.stringify(actionValue), 50) : ''; return { actionType: actionType || 'unknown', displayValue }; }; From 67d6884533f6cdac660c5a47d06af03f81aca995 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 15:14:02 -0800 Subject: [PATCH 52/90] Add inline source handling and new spec creation tests in TestBuilder --- cli/src/cli/builder/TestBuilder.mjs | 149 +++++++++++----------- cli/test/builder/TestBuilder.test.mjs | 176 ++++++++++++++++++++++++++ 2 files changed, 251 insertions(+), 74 deletions(-) diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index 47b5c19..3043eba 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -210,6 +210,81 @@ const TestBuilder = ({ } }); + // Pre-save check for inline sources - handled by useEffect to avoid state updates during render + // NOTE: All useEffect hooks must be called before any conditional returns to maintain hook order + useEffect(() => { + if (phase !== 'preSave') return; + + // Check if any inline source files have changed + const changed = getInlineSourceFiles(spec).filter( + file => sourceFileHashes[file] && hasSourceFileChanged(file, sourceFileHashes[file]) + ); + + // Determine the next phase + const nextPhase = changed.length > 0 + ? 'sourceChanged' + : (hasInlineSources ? 'inlineSaveChoice' : 'save'); + + // Only update if changed files differ from current + const changedFilesMatch = + changed.length === changedSourceFiles.length && + changed.every((file, i) => changedSourceFiles[i] === file); + + if (!changedFilesMatch) { + setChangedSourceFiles(changed); + } + setPhase(nextPhase); + }, [phase, spec, sourceFileHashes, hasInlineSources, changedSourceFiles]); + + // Effect to handle inline source updates when phase changes to 'inlineUpdate' + useEffect(() => { + if (phase !== 'inlineUpdate') { + return; + } + + let cancelled = false; + + const performInlineUpdate = async () => { + // Use prepareSourceUpdates to handle both explicit inline steps and auto-detected steps + // Auto-detected steps will have new explicit comments inserted after the original content + const updatesByFile = prepareSourceUpdates({ spec, originalSpec }); + + // Apply updates to each file + const errors = []; + for (const [file, updates] of updatesByFile) { + if (cancelled) return; + const result = batchUpdateSourceContent({ filePath: file, updates }); + if (!result.success) { + errors.push(`${path.basename(file)}: ${result.error || 'Unknown error'}`); + } + } + + if (cancelled) return; + + if (errors.length > 0) { + setInlineUpdateError(errors.join('\n')); + setPhase('inlineUpdateError'); + } else { + // Update hashes for modified files + const newHashes = { ...sourceFileHashes }; + for (const file of updatesByFile.keys()) { + const hash = getFileContentHash(file); + if (hash) { + newHashes[file] = hash; + } + } + setSourceFileHashes(newHashes); + setPhase('inlineUpdateSuccess'); + } + }; + + performInlineUpdate(); + + return () => { + cancelled = true; + }; + }, [phase, spec, originalSpec, sourceFileHashes]); + // Show validation warning for invalid loaded specs if (showValidationWarning) { return React.createElement( @@ -571,31 +646,6 @@ const TestBuilder = ({ ); } - // Pre-save check for inline sources - handled by useEffect to avoid state updates during render - useEffect(() => { - if (phase !== 'preSave') return; - - // Check if any inline source files have changed - const changed = getInlineSourceFiles(spec).filter( - file => sourceFileHashes[file] && hasSourceFileChanged(file, sourceFileHashes[file]) - ); - - // Determine the next phase - const nextPhase = changed.length > 0 - ? 'sourceChanged' - : (hasInlineSources ? 'inlineSaveChoice' : 'save'); - - // Only update if changed files differ from current - const changedFilesMatch = - changed.length === changedSourceFiles.length && - changed.every((file, i) => changedSourceFiles[i] === file); - - if (!changedFilesMatch) { - setChangedSourceFiles(changed); - } - setPhase(nextPhase); - }, [phase, spec, sourceFileHashes, hasInlineSources, changedSourceFiles]); - if (phase === 'preSave') { return React.createElement( Box, @@ -708,55 +758,6 @@ const TestBuilder = ({ ); } - // Effect to handle inline source updates when phase changes to 'inlineUpdate' - useEffect(() => { - if (phase !== 'inlineUpdate') { - return; - } - - let cancelled = false; - - const performInlineUpdate = async () => { - // Use prepareSourceUpdates to handle both explicit inline steps and auto-detected steps - // Auto-detected steps will have new explicit comments inserted after the original content - const updatesByFile = prepareSourceUpdates({ spec, originalSpec }); - - // Apply updates to each file - const errors = []; - for (const [file, updates] of updatesByFile) { - if (cancelled) return; - const result = batchUpdateSourceContent({ filePath: file, updates }); - if (!result.success) { - errors.push(`${path.basename(file)}: ${result.error || 'Unknown error'}`); - } - } - - if (cancelled) return; - - if (errors.length > 0) { - setInlineUpdateError(errors.join('\n')); - setPhase('inlineUpdateError'); - } else { - // Update hashes for modified files - const newHashes = { ...sourceFileHashes }; - for (const file of updatesByFile.keys()) { - const hash = getFileContentHash(file); - if (hash) { - newHashes[file] = hash; - } - } - setSourceFileHashes(newHashes); - setPhase('inlineUpdateSuccess'); - } - }; - - performInlineUpdate(); - - return () => { - cancelled = true; - }; - }, [phase, spec, originalSpec, sourceFileHashes]); - // Update inline sources - render only, no side effects if (phase === 'inlineUpdate') { return React.createElement( diff --git a/cli/test/builder/TestBuilder.test.mjs b/cli/test/builder/TestBuilder.test.mjs index a4c2445..74e7ee8 100644 --- a/cli/test/builder/TestBuilder.test.mjs +++ b/cli/test/builder/TestBuilder.test.mjs @@ -31,6 +31,9 @@ before(async function () { global.expect = expect; }); +// Helper to wait for React state updates after input +const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); + describe('TestBuilder component', function () { // Temp file handling for save tests const tempDir = path.join(__dirname, 'temp'); @@ -349,4 +352,177 @@ describe('TestBuilder component', function () { expect(frame).to.include('3 steps'); }); }); + + describe('creating a new spec', function () { + it('shows name input phase when no initial spec is provided', function () { + const { lastFrame } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Doc Detective Test Builder'); + expect(frame).to.include('Spec name'); + expect(frame).to.include('Create a new test specification'); + }); + + it('shows expected output path hint in name input phase', function () { + const { lastFrame } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Will be saved as'); + expect(frame).to.include('.spec.json'); + }); + + it('shows navigation hints in name input phase', function () { + const { lastFrame } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Press Enter to continue'); + expect(frame).to.include('Esc to exit'); + }); + + it('skips name phase when initial spec is provided', function () { + const spec = getMockSpec({ specId: 'pre-existing-spec' }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'pre-existing-spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + // Should go directly to menu, not name input + expect(frame).to.not.include('Create a new test specification'); + expect(frame).to.include('Test Builder'); + expect(frame).to.include('pre-existing-spec'); + }); + + it('shows empty test list for new spec', function () { + const spec = getMockSpec({ specId: 'new-empty-spec', tests: [] }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'new-empty-spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('Tests (0)'); + expect(frame).to.include('Add at least one test'); + }); + + it('uses specId from initialSpec when provided', function () { + const spec = getMockSpec({ specId: 'custom-spec-id' }); + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'test.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('custom-spec-id'); + }); + + it('derives spec name from filename when specId not in initialSpec', function () { + const spec = getMockSpec(); + delete spec.specId; + const { lastFrame } = render( + React.createElement(TestBuilder, { + initialSpec: spec, + inputFilePath: path.join(tempDir, 'my-derived-name.spec.json'), + outputDir: tempDir, + }) + ); + + const frame = lastFrame(); + expect(frame).to.include('my-derived-name.spec'); + }); + + it('allows entering a spec name via keyboard input', async function () { + const { lastFrame, stdin } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + // Initial state: name input phase with placeholder + let frame = lastFrame(); + expect(frame).to.include('Spec name'); + expect(frame).to.include('my-tests'); // placeholder + + // Type a spec name (full string at once) + stdin.write('my-spec'); + + // Wait for React to process the input + await delay(50); + + frame = lastFrame(); + expect(frame).to.include('my-spec'); + expect(frame).to.include('my-spec.spec.json'); + }); + + it('transitions to menu phase after entering name and pressing Enter', async function () { + const { lastFrame, stdin } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + // Type a spec name + stdin.write('test-spec'); + await delay(50); + + // Press Enter to submit + stdin.write('\r'); + await delay(50); + + // Should transition to menu phase + const frame = lastFrame(); + expect(frame).to.include('Test Builder'); + expect(frame).to.include('test-spec'); + expect(frame).to.include('Tests (0)'); + expect(frame).to.include('Add test'); + }); + + it('does not transition to menu if spec name is empty when Enter is pressed', async function () { + const { lastFrame, stdin } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + // Initial state: name input phase + let frame = lastFrame(); + expect(frame).to.include('Spec name'); + + // Press Enter without entering a name (spec name is empty by default) + stdin.write('\r'); + await delay(50); + + // Should stay in name input phase + frame = lastFrame(); + expect(frame).to.include('Spec name'); + expect(frame).to.include('Create a new test specification'); + }); + + it('initializes spec with specId matching entered name', async function () { + const { lastFrame, stdin } = render( + React.createElement(TestBuilder, { outputDir: tempDir }) + ); + + // Type a spec name and submit + stdin.write('my-initialized-spec'); + await delay(50); + + stdin.write('\r'); + await delay(50); + + // Should be in menu phase with the spec initialized + const frame = lastFrame(); + expect(frame).to.include('my-initialized-spec'); + expect(frame).to.include('specId: my-initialized-spec'); + }); + }); }); From ee59664aedc49bcffa3520d0a11772409fd32742 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 15:34:21 -0800 Subject: [PATCH 53/90] Fix goTo check in hasGoToBefore function and clear auto-advance timer in DebugRunner --- cli/src/cli/builder/DebugRunner.mjs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cli/src/cli/builder/DebugRunner.mjs b/cli/src/cli/builder/DebugRunner.mjs index 61dc488..ab792d4 100644 --- a/cli/src/cli/builder/DebugRunner.mjs +++ b/cli/src/cli/builder/DebugRunner.mjs @@ -74,7 +74,7 @@ function findFirstBrowserStepIndex(steps) { */ function hasGoToBefore(steps, beforeIndex) { for (let i = 0; i < beforeIndex; i++) { - if (steps[i].goTo !== undefined) { + if (steps[i].goTo) { return true; } } @@ -163,6 +163,11 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { if (phase === 'stepEdit') { setPhase('stepPreview'); } else if (phase === 'stepPreview' || phase === 'stepResult') { + // Clear auto-advance timer when leaving stepResult + if (autoAdvanceTimer.current) { + clearTimeout(autoAdvanceTimer.current); + autoAdvanceTimer.current = null; + } // Confirm exit setPhase('confirmExit'); } From 2808297fef86abe6148be202cd0383a9c165e722 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 15:35:11 -0800 Subject: [PATCH 54/90] Enhance GoToInput backspace handling for grapheme-safe URL truncation --- cli/src/cli/builder/DebugRunner.mjs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cli/src/cli/builder/DebugRunner.mjs b/cli/src/cli/builder/DebugRunner.mjs index ab792d4..3a234be 100644 --- a/cli/src/cli/builder/DebugRunner.mjs +++ b/cli/src/cli/builder/DebugRunner.mjs @@ -673,7 +673,16 @@ const GoToInput = ({ onSubmit, onCancel }) => { return; } if (key.backspace || key.delete) { - setUrl((prev) => prev.slice(0, -1)); + setUrl((prev) => { + if (prev.length === 0) return prev; + if (typeof Intl !== 'undefined' && Intl.Segmenter) { + const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' }); + const segments = [...segmenter.segment(prev)]; + return segments.slice(0, -1).map(s => s.segment).join(''); + } + const chars = Array.from(prev); + return chars.slice(0, -1).join(''); + }); return; } if (!key.ctrl && !key.meta && input) { From c7e69b279963b23018bb32f03ef97d740c6be62a Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 15:37:06 -0800 Subject: [PATCH 55/90] Refactor inline source file change detection to use Array.from for better compatibility --- cli/src/cli/builder/TestBuilder.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index 3043eba..3e19204 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -216,7 +216,7 @@ const TestBuilder = ({ if (phase !== 'preSave') return; // Check if any inline source files have changed - const changed = getInlineSourceFiles(spec).filter( + const changed = Array.from(getInlineSourceFiles(spec)).filter( file => sourceFileHashes[file] && hasSourceFileChanged(file, sourceFileHashes[file]) ); From df2c0018c472f2c393573f357b91803ce8233b9d Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 15:52:03 -0800 Subject: [PATCH 56/90] Refactor ScrollableSelect to use highlightedIndex for improved scrolling logic and indicator calculations --- cli/src/cli/builder/components.mjs | 68 +++++++++++++++++++----------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/cli/src/cli/builder/components.mjs b/cli/src/cli/builder/components.mjs index 02398a0..9d1af0c 100644 --- a/cli/src/cli/builder/components.mjs +++ b/cli/src/cli/builder/components.mjs @@ -64,11 +64,12 @@ export const ScrollableSelect = ({ initialIndex = 0, }) => { const { stdout } = useStdout(); - const [selectedIndex, setSelectedIndex] = useState(initialIndex); + // Track the actual index in the full items array (not the visible window) + const [highlightedIndex, setHighlightedIndex] = useState(initialIndex); // Sync local state when initialIndex prop changes useEffect(() => { - setSelectedIndex(initialIndex); + setHighlightedIndex(initialIndex); }, [initialIndex]); // Calculate visible items based on terminal height @@ -76,38 +77,52 @@ export const ScrollableSelect = ({ const availableLines = Math.max(terminalHeight - reservedLines, linesPerItem); const defaultLimit = Math.max(1, Math.floor(availableLines / linesPerItem)); const limit = customLimit || defaultLimit; + + // Check if we need scrolling at all + const hasLimit = items.length > limit; - // Track scroll position - const scrollOffset = useMemo(() => { - if (selectedIndex < limit) { - return 0; - } - return Math.min(selectedIndex - limit + 1, items.length - limit); - }, [selectedIndex, limit, items.length]); - - const hasItemsAbove = scrollOffset > 0; - const hasItemsBelow = scrollOffset + limit < items.length; - - // Handle keyboard navigation to track selected index - useInput((input, key) => { - if (key.upArrow) { - setSelectedIndex(prev => Math.max(0, prev - 1)); - } else if (key.downArrow) { - setSelectedIndex(prev => Math.min(items.length - 1, prev + 1)); + // Calculate scroll indicators based on ink-select-input's rotation behavior + // ink-select-input uses array rotation: when you scroll down past the limit, + // it rotates the array so the selected item stays visible within the limit window + const scrollInfo = useMemo(() => { + if (!hasLimit) { + return { hasItemsAbove: false, hasItemsBelow: false, aboveCount: 0, belowCount: 0 }; } - }); + + // ink-select-input keeps the selected item visible by rotating the array + // The visible window always contains `limit` items with the selection inside it + // We need to figure out which items are "before" and "after" the visible window + + // When selectedIndex is within [0, limit-1], no rotation needed, window is [0, limit) + // When selectedIndex >= limit, the window has rotated to keep selection visible + + // The rotation keeps the highlighted item visible, so we calculate based on + // where we are in the full list + const aboveCount = Math.max(0, highlightedIndex - (limit - 1)); + const belowCount = Math.max(0, items.length - highlightedIndex - 1); + + // Clamp belowCount to account for visible items + const adjustedBelowCount = Math.max(0, items.length - limit - aboveCount); + + return { + hasItemsAbove: aboveCount > 0, + hasItemsBelow: adjustedBelowCount > 0, + aboveCount, + belowCount: adjustedBelowCount, + }; + }, [highlightedIndex, limit, items.length, hasLimit]); return React.createElement( Box, { flexDirection: 'column' }, // Scroll up indicator - hasItemsAbove && React.createElement( + scrollInfo.hasItemsAbove && React.createElement( Box, { marginLeft: 2 }, React.createElement( Text, { color: 'yellow' }, - `▲ ${scrollOffset} more above` + `▲ ${scrollInfo.aboveCount} more above` ) ), // The actual select input @@ -119,18 +134,21 @@ export const ScrollableSelect = ({ indicatorComponent, onSelect, onHighlight: (item) => { + // Track the highlighted item's index in the full items array const idx = items.findIndex(i => i.value === item.value); - if (idx !== -1) setSelectedIndex(idx); + if (idx !== -1) { + setHighlightedIndex(idx); + } }, }), // Scroll down indicator - hasItemsBelow && React.createElement( + scrollInfo.hasItemsBelow && React.createElement( Box, { marginLeft: 2 }, React.createElement( Text, { color: 'yellow' }, - `▼ ${items.length - scrollOffset - limit} more below` + `▼ ${scrollInfo.belowCount} more below` ) ) ); From 35a0024afcadd16faaf498357f591a5bad9a042d Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 19:41:27 -0800 Subject: [PATCH 57/90] deps --- cli/package-lock.json | 224 ++++++------------------------------- cli/package.json | 2 +- resolver/package-lock.json | 2 - 3 files changed, 35 insertions(+), 193 deletions(-) diff --git a/cli/package-lock.json b/cli/package-lock.json index 65642e8..8a5ec91 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -13,7 +13,7 @@ "axios": "^1.13.2", "doc-detective-common": "^3.5.1", "doc-detective-core": "file:../core", - "doc-detective-resolver": "^3.6.1", + "doc-detective-resolver": "file:../resolver", "ink": "^6.5.1", "ink-select-input": "^6.2.0", "ink-spinner": "^5.0.0", @@ -102,6 +102,30 @@ "@img/sharp-win32-x64": "^0.34.5" } }, + "../resolver": { + "name": "doc-detective-resolver", + "version": "3.6.1", + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ajv": "^8.17.1", + "axios": "^1.13.2", + "doc-detective-common": "^3.6.0", + "dotenv": "^17.2.3", + "json-schema-faker": "^0.5.9", + "posthog-node": "^5.17.0" + }, + "devDependencies": { + "body-parser": "^2.2.1", + "chai": "^6.2.1", + "express": "^5.2.1", + "mocha": "^11.7.5", + "proxyquire": "^2.1.3", + "semver": "^7.7.3", + "sinon": "^21.0.0", + "yaml": "^2.8.2" + } + }, "node_modules/@alcalzone/ansi-tokenize": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.2.tgz", @@ -327,30 +351,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@jsep-plugin/assignment": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", - "integrity": "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, - "node_modules/@jsep-plugin/regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz", - "integrity": "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==", - "license": "MIT", - "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -361,15 +361,6 @@ "node": ">=14" } }, - "node_modules/@posthog/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.1.tgz", - "integrity": "sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -467,7 +458,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -692,12 +682,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -971,6 +955,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -984,12 +969,14 @@ "node_modules/cross-spawn/node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -1067,31 +1054,8 @@ "link": true }, "node_modules/doc-detective-resolver": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.6.1.tgz", - "integrity": "sha512-8loBGZctT4JWo5PgjYk9b4ZRyJy/Od33KKd5Q+Sa/XEiaQ0e6602e9oI/JDfmnaB1KGUi9qTigezRLIMQlH+Dw==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ajv": "^8.17.1", - "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", - "dotenv": "^17.2.3", - "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" - } - }, - "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } + "resolved": "../resolver", + "link": true }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -1227,19 +1191,6 @@ "node": ">=8" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1470,12 +1421,6 @@ "node": ">= 6" } }, - "node_modules/format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "license": "MIT" - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1687,7 +1632,6 @@ "resolved": "https://registry.npmjs.org/ink/-/ink-6.5.1.tgz", "integrity": "sha512-wF3j/DmkM8q5E+OtfdQhCRw8/0ahkc8CUTgEddxZzpEWPslu7YPL3t64MWRoI9m6upVGpfAg4ms2BBvxCdKRLQ==", "license": "MIT", - "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.1", "ansi-escapes": "^7.2.0", @@ -1999,86 +1943,11 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsep": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", - "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/json-schema-faker": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", - "integrity": "sha512-fNKLHgDvfGNNTX1zqIjqFMJjCLzJ2kvnJ831x4aqkAoeE4jE2TxvpJdhOnk3JU3s42vFzmXvkpbYzH5H3ncAzg==", - "license": "MIT", - "dependencies": { - "json-schema-ref-parser": "^6.1.0", - "jsonpath-plus": "^10.3.0" - }, - "bin": { - "jsf": "bin/gen.cjs" - } - }, - "node_modules/json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "license": "MIT", - "dependencies": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" - } - }, - "node_modules/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/jsonpath-plus": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", - "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", - "license": "MIT", - "dependencies": { - "@jsep-plugin/assignment": "^1.3.0", - "@jsep-plugin/regex": "^1.0.4", - "jsep": "^1.4.0" - }, - "bin": { - "jsonpath": "bin/jsonpath-cli.js", - "jsonpath-plus": "bin/jsonpath-cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/just-extend": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", @@ -2340,15 +2209,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "license": "MIT", - "dependencies": { - "format-util": "^1.0.3" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2417,6 +2277,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -2455,18 +2316,6 @@ "dev": true, "license": "ISC" }, - "node_modules/posthog-node": { - "version": "5.17.2", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", - "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", - "license": "MIT", - "dependencies": { - "@posthog/core": "1.7.1" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -2560,7 +2409,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -2753,6 +2601,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -2764,6 +2613,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -2931,12 +2781,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", diff --git a/cli/package.json b/cli/package.json index 6ce7c60..a81d4cc 100644 --- a/cli/package.json +++ b/cli/package.json @@ -36,7 +36,7 @@ "axios": "^1.13.2", "doc-detective-common": "^3.5.1", "doc-detective-core": "file:../core", - "doc-detective-resolver": "^3.6.1", + "doc-detective-resolver": "file:../resolver", "ink": "^6.5.1", "ink-select-input": "^6.2.0", "ink-spinner": "^5.0.0", diff --git a/resolver/package-lock.json b/resolver/package-lock.json index 10020cc..5cf2118 100644 --- a/resolver/package-lock.json +++ b/resolver/package-lock.json @@ -222,7 +222,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1373,7 +1372,6 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 10.16.0" } From 8df394af4899d3ef585bad0ca9f63ebcda9ca6e9 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 19:41:36 -0800 Subject: [PATCH 58/90] Refactor source file utilities for improved inline test editing functionality --- cli/src/cli/builder/TestBuilder.mjs | 23 +++++++++++++++++------ cli/src/cli/builder/sourceFileUtils.js | 6 ++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index 3e19204..63a4f40 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -41,9 +41,10 @@ const { * @param {string|null} inputFileExtension - Original file extension * @param {string} specName - Spec name for new files * @param {string} outputDir - Default output directory + * @param {string|null} contentPath - The spec's contentPath (for markdown files with inline tests) * @returns {string} The computed output file path */ -function computeOutputPath(inputFilePath, inputFileExtension, specName, outputDir) { +function computeOutputPath(inputFilePath, inputFileExtension, specName, outputDir, contentPath = null) { if (inputFilePath) { const ext = inputFileExtension?.toLowerCase() || path.extname(inputFilePath).toLowerCase(); @@ -52,7 +53,13 @@ function computeOutputPath(inputFilePath, inputFileExtension, specName, outputDi return inputFilePath; } - // For other formats (e.g., .md), save as .spec.json in the same directory + // For markdown files with contentPath (inline tests), use the original file + // The contentPath indicates the spec was extracted from markdown with inline tests + if (contentPath) { + return inputFilePath; + } + + // For other formats (e.g., .md without inline tests), save as .spec.json in the same directory const dir = path.dirname(inputFilePath); const baseName = path.basename(inputFilePath, ext); return path.join(dir, `${baseName}.spec.json`); @@ -169,8 +176,11 @@ const TestBuilder = ({ return currentJson !== originalJson; }, [spec, originalSpec]); - // Check if spec has inline source locations - const hasInlineSources = useMemo(() => hasInlineSourceLocations(spec), [spec]); + // Check if spec has inline source locations (either via sourceLocation.isInline or via contentPath) + // contentPath indicates the spec was extracted from a markdown file with inline tests + const hasInlineSources = useMemo(() => { + return hasInlineSourceLocations(spec) || !!spec.contentPath; + }, [spec]); // Check if spec has auto-detected steps const hasAutoDetected = useMemo(() => hasAutoDetectedSteps(spec), [spec]); @@ -188,9 +198,10 @@ const TestBuilder = ({ }, [spec]); // Get file path - use computed path for existing files, or generate new path + // Pass the spec's contentPath to determine if this is a markdown file with inline tests const filePath = useMemo(() => { - return computeOutputPath(inputFilePath, inputFileExtension, specName, saveDir); - }, [inputFilePath, inputFileExtension, specName, saveDir]); + return computeOutputPath(inputFilePath, inputFileExtension, specName, saveDir, spec.contentPath); + }, [inputFilePath, inputFileExtension, specName, saveDir, spec.contentPath]); // Get output format const outputFormat = useMemo(() => getOutputFormat(filePath), [filePath]); diff --git a/cli/src/cli/builder/sourceFileUtils.js b/cli/src/cli/builder/sourceFileUtils.js index 481e842..99bb8fc 100644 --- a/cli/src/cli/builder/sourceFileUtils.js +++ b/cli/src/cli/builder/sourceFileUtils.js @@ -669,6 +669,12 @@ function getInlineSourceFiles(spec) { if (!spec) return files; + // If spec has contentPath, include it as an inline source file + // contentPath indicates the spec was extracted from a markdown file with inline tests + if (spec.contentPath) { + files.add(spec.contentPath); + } + for (const test of (spec.tests || [])) { if (test.sourceLocation?.isInline && test.sourceLocation.file) { files.add(test.sourceLocation.file); From 629c8fdb6787fa2c662fe52f1f28e54078550ce9 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 8 Dec 2025 20:02:44 -0800 Subject: [PATCH 59/90] local dev --- cli/package-lock.json | 153 ++----- cli/package.json | 2 +- core/package-lock.json | 811 +++++++++++++++++++++++++++++-------- core/package.json | 4 +- resolver/package-lock.json | 79 ++-- resolver/package.json | 2 +- 6 files changed, 707 insertions(+), 344 deletions(-) diff --git a/cli/package-lock.json b/cli/package-lock.json index 8a5ec91..7b61ed3 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", "axios": "^1.13.2", - "doc-detective-common": "^3.5.1", + "doc-detective-common": "file:../common", "doc-detective-core": "file:../core", "doc-detective-resolver": "file:../resolver", "ink": "^6.5.1", @@ -34,6 +34,29 @@ "sinon": "^19.0.2" } }, + "../common": { + "name": "doc-detective-common", + "version": "3.6.0", + "license": "AGPL-3.0-only", + "dependencies": { + "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/openai": "^2.0.80", + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.108", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "yaml": "^2.8.2", + "zod": "^4.1.13" + }, + "devDependencies": { + "chai": "^6.2.1", + "mocha": "^11.7.5", + "sinon": "^21.0.0" + } + }, "../core": { "name": "doc-detective-core", "version": "3.6.2", @@ -49,8 +72,8 @@ "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", - "doc-detective-resolver": "^3.6.1", + "doc-detective-common": "file:../common", + "doc-detective-resolver": "file:../resolver", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", @@ -110,7 +133,7 @@ "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", + "doc-detective-common": "file:../common", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", "posthog-node": "^5.17.0" @@ -166,21 +189,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", - "integrity": "sha512-XvEitlOaU8S+hOrMPuGyCjp6vC51K+syUN4HHrSUdSDLLWRWQJYjInU6xlSoRGCVBCfcoHxbRm+yiaYq2yFR5w==", - "license": "MIT", - "dependencies": { - "js-yaml": "^4.1.1" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@types/json-schema": "^7.0.15" - } - }, "node_modules/@ffmpeg-installer/darwin-arm64": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz", @@ -409,13 +417,6 @@ "dev": true, "license": "(Unlicense OR Apache-2.0)" }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT", - "peer": true - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -453,57 +454,6 @@ "node": ">= 0.6" } }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/ansi-escapes": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", @@ -1035,19 +985,8 @@ } }, "node_modules/doc-detective-common": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.6.0.tgz", - "integrity": "sha512-rHZ3WNuw3Y51KduBh9GgnrYFzJdbCQHPP3xnkp+W8QyF+4bKhWFlVVmbotFh/XL3BupbV9+CP7YEBTsW02Hvuw==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.13.2", - "yaml": "^2.8.2" - } + "resolved": "../common", + "link": true }, "node_modules/doc-detective-core": { "resolved": "../core", @@ -1277,27 +1216,6 @@ "node": ">= 0.6" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", @@ -1943,11 +1861,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/just-extend": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", @@ -2451,14 +2364,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", diff --git a/cli/package.json b/cli/package.json index a81d4cc..cded37b 100644 --- a/cli/package.json +++ b/cli/package.json @@ -34,7 +34,7 @@ "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", "axios": "^1.13.2", - "doc-detective-common": "^3.5.1", + "doc-detective-common": "file:../common", "doc-detective-core": "file:../core", "doc-detective-resolver": "file:../resolver", "ink": "^6.5.1", diff --git a/core/package-lock.json b/core/package-lock.json index 0b3709f..104f932 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -19,8 +19,8 @@ "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", - "doc-detective-resolver": "^3.6.1", + "doc-detective-common": "file:../common", + "doc-detective-resolver": "file:../resolver", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", @@ -72,6 +72,53 @@ "@img/sharp-win32-x64": "^0.34.5" } }, + "../common": { + "name": "doc-detective-common", + "version": "3.6.0", + "license": "AGPL-3.0-only", + "dependencies": { + "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/openai": "^2.0.80", + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.108", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "yaml": "^2.8.2", + "zod": "^4.1.13" + }, + "devDependencies": { + "chai": "^6.2.1", + "mocha": "^11.7.5", + "sinon": "^21.0.0" + } + }, + "../resolver": { + "name": "doc-detective-resolver", + "version": "3.6.1", + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ajv": "^8.17.1", + "axios": "^1.13.2", + "doc-detective-common": "file:../common", + "dotenv": "^17.2.3", + "json-schema-faker": "^0.5.9", + "posthog-node": "^5.17.0" + }, + "devDependencies": { + "body-parser": "^2.2.1", + "chai": "^6.2.1", + "express": "^5.2.1", + "mocha": "^11.7.5", + "proxyquire": "^2.1.3", + "semver": "^7.7.3", + "sinon": "^21.0.0", + "yaml": "^2.8.2" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "15.1.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", @@ -1765,7 +1812,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1777,15 +1823,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, "node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -1803,18 +1840,6 @@ } } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1848,7 +1873,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -6730,6 +6754,7 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -6764,6 +6789,7 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -6778,6 +6804,7 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -6807,6 +6834,7 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -6980,6 +7008,7 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", + "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -7506,6 +7535,7 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -7521,6 +7551,7 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", + "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -7542,7 +7573,8 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/@xmldom/xmldom": { "version": "0.8.11", @@ -7570,6 +7602,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", + "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -7583,6 +7616,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", + "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -7628,6 +7662,7 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -7694,6 +7729,7 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -7826,7 +7862,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "license": "Python-2.0", + "peer": true }, "node_modules/appium-geckodriver/node_modules/async": { "version": "3.2.6", @@ -7936,6 +7973,7 @@ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", + "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -7957,6 +7995,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", + "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7968,6 +8007,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7988,6 +8028,7 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", + "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -8043,6 +8084,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8068,6 +8110,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -8090,6 +8133,7 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -8134,6 +8178,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", + "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -8146,6 +8191,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -8158,6 +8204,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", + "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -8172,6 +8219,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8183,13 +8231,15 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -8207,6 +8257,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -8224,6 +8275,7 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.8" } @@ -8233,6 +8285,7 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -8264,6 +8317,7 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", + "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -8276,6 +8330,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.20" } @@ -8285,6 +8340,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", + "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -8297,6 +8353,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.20" } @@ -8318,6 +8375,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 6" } @@ -8343,6 +8401,7 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", + "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -8358,6 +8417,7 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -8371,6 +8431,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -8380,6 +8441,7 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -8389,6 +8451,7 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.6.0" } @@ -8464,6 +8527,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -8481,6 +8545,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", + "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -8502,6 +8567,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -8521,13 +8587,15 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-geckodriver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.3.1" } @@ -8562,7 +8630,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/emoji-regex": { "version": "9.2.2", @@ -8574,13 +8643,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -8644,6 +8715,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -8652,13 +8724,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -8695,6 +8769,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -8767,6 +8842,7 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 4.9.1" } @@ -8775,13 +8851,15 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -8818,7 +8896,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/follow-redirects": { "version": "1.15.11", @@ -8910,6 +8989,7 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -8919,6 +8999,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -8972,6 +9053,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", + "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -8981,6 +9063,7 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -9098,7 +9181,8 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-geckodriver/node_modules/has-flag": { "version": "4.0.0", @@ -9160,6 +9244,7 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9172,7 +9257,8 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -9180,6 +9266,7 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9196,6 +9283,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -9205,13 +9293,15 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-geckodriver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", + "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -9231,13 +9321,15 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9285,6 +9377,7 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.10" } @@ -9324,6 +9417,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -9341,7 +9435,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/is-stream": { "version": "2.0.1", @@ -9456,6 +9551,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9464,7 +9560,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/lazystream": { "version": "1.0.1", @@ -9513,6 +9610,7 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", + "peer": true, "engines": { "node": ">=14" }, @@ -9583,6 +9681,7 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -9618,6 +9717,7 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -9627,6 +9727,7 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -9639,6 +9740,7 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", + "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -9654,6 +9756,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9662,13 +9765,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -9678,6 +9783,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -9687,6 +9793,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", + "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -9703,6 +9810,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -9712,7 +9820,8 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-geckodriver/node_modules/minipass": { "version": "7.1.2", @@ -9737,6 +9846,7 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", + "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -9753,6 +9863,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9761,13 +9872,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9795,6 +9908,7 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -9834,6 +9948,7 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -9846,13 +9961,15 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-geckodriver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9865,6 +9982,7 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -9883,6 +10001,7 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", + "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -9892,6 +10011,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -9907,6 +10027,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", + "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -9930,6 +10051,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -9939,6 +10061,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9981,6 +10104,7 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", + "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -10025,6 +10149,7 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -10074,6 +10199,7 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -10169,6 +10295,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", + "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -10188,6 +10315,7 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -10203,6 +10331,7 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -10212,6 +10341,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", + "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -10227,6 +10357,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -10376,6 +10507,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", + "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -10389,6 +10521,7 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -10411,6 +10544,7 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -10419,7 +10553,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/sanitize-filename": { "version": "1.6.3", @@ -10435,7 +10570,8 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-geckodriver/node_modules/semver": { "version": "7.7.3", @@ -10454,6 +10590,7 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -10476,6 +10613,7 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", + "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -10492,6 +10630,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -10514,13 +10653,15 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", + "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -10541,7 +10682,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-geckodriver/node_modules/sharp": { "version": "0.34.5", @@ -10626,6 +10768,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -10645,6 +10788,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -10661,6 +10805,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10679,6 +10824,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10756,6 +10902,7 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -10773,6 +10920,7 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -10788,6 +10936,7 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10802,6 +10951,7 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -10811,6 +10961,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -11049,7 +11200,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/through": { "version": "2.3.8", @@ -11062,6 +11214,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.6" } @@ -11071,6 +11224,7 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 14.0.0" } @@ -11111,6 +11265,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", + "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -11134,6 +11289,7 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -11178,6 +11334,7 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -11188,6 +11345,7 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -11197,6 +11355,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", + "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -11221,6 +11380,7 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -11243,6 +11403,7 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", + "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -11257,6 +11418,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11271,6 +11433,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11285,6 +11448,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11361,6 +11525,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -11369,13 +11534,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11390,6 +11557,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11408,6 +11576,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -11438,6 +11607,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", + "peer": true, "engines": { "node": ">=10" } @@ -11447,6 +11617,7 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -11459,6 +11630,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", + "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -11476,6 +11648,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", + "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -11484,13 +11657,15 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-geckodriver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -11579,6 +11754,7 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -11613,6 +11789,7 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -11627,6 +11804,7 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -11656,6 +11834,7 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11688,6 +11867,7 @@ "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" @@ -11702,6 +11882,7 @@ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/tsconfig": "^1.1.0", @@ -11752,6 +11933,7 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11768,6 +11950,7 @@ "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@tsconfig/node20": "20.1.6" }, @@ -11781,6 +11964,7 @@ "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/schema": "^1.0.0", @@ -11797,6 +11981,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -11811,6 +11996,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" } @@ -11820,6 +12006,7 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.1.90" } @@ -11829,6 +12016,7 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", + "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -11851,6 +12039,7 @@ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=18" } @@ -11867,6 +12056,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -11889,6 +12079,7 @@ "os": [ "darwin" ], + "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -11919,6 +12110,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", + "peer": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -11936,6 +12128,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -11948,6 +12141,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -11966,6 +12160,7 @@ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=14" } @@ -11975,6 +12170,7 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -11990,6 +12186,7 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", + "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -11999,25 +12196,29 @@ "version": "20.1.6", "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/@xmldom/xmldom": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" } @@ -12027,6 +12228,7 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", + "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -12039,6 +12241,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", + "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -12052,6 +12255,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", + "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -12069,6 +12273,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -12081,6 +12286,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12097,6 +12303,7 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -12141,6 +12348,7 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -12157,6 +12365,7 @@ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "license": "MIT", + "peer": true, "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", @@ -12175,6 +12384,7 @@ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "license": "MIT", + "peer": true, "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", @@ -12193,6 +12403,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -12202,6 +12413,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", + "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -12222,6 +12434,7 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -12236,13 +12449,15 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12258,6 +12473,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -12273,19 +12489,22 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "license": "Python-2.0", + "peer": true }, "node_modules/appium-safari-driver/node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/async-lock": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/asyncbox": { "version": "3.0.0", @@ -12305,13 +12524,15 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/axios": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", + "peer": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -12323,6 +12544,7 @@ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "license": "Apache-2.0", + "peer": true, "peerDependencies": { "react-native-b4a": "*" }, @@ -12336,13 +12558,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/bare-events": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", + "peer": true, "peerDependencies": { "bare-abort-controller": "*" }, @@ -12370,19 +12594,22 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/base64-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", + "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -12395,6 +12622,7 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "license": "Unlicense", + "peer": true, "engines": { "node": ">=0.6" } @@ -12404,6 +12632,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", + "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -12415,6 +12644,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12435,6 +12665,7 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", + "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -12455,6 +12686,7 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", "license": "MIT", + "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -12464,6 +12696,7 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", + "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -12490,6 +12723,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12500,6 +12734,7 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -12515,6 +12750,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -12524,6 +12760,7 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -12537,6 +12774,7 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -12553,6 +12791,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12569,6 +12808,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12581,6 +12821,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", + "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -12593,6 +12834,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" }, @@ -12605,6 +12847,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", + "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -12619,6 +12862,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -12630,13 +12874,15 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -12654,6 +12900,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -12671,6 +12918,7 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.8" } @@ -12680,6 +12928,7 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -12693,6 +12942,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12704,13 +12954,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/color-string": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", + "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12723,6 +12975,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.20" } @@ -12732,6 +12985,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", + "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12744,6 +12998,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", + "peer": true, "engines": { "node": ">=12.20" } @@ -12753,6 +13008,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", + "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -12765,6 +13021,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 6" } @@ -12774,6 +13031,7 @@ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "license": "MIT", + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", @@ -12790,6 +13048,7 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", + "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -12805,6 +13064,7 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -12818,6 +13078,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -12827,6 +13088,7 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -12836,6 +13098,7 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.6.0" } @@ -12844,13 +13107,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "license": "Apache-2.0", + "peer": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -12863,6 +13128,7 @@ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "license": "MIT", + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" @@ -12876,6 +13142,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", + "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -12889,13 +13156,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -12911,6 +13180,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -12928,6 +13198,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", + "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -12940,6 +13211,7 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.4.0" } @@ -12949,6 +13221,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -12959,6 +13232,7 @@ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -12968,13 +13242,15 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-safari-driver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.3.1" } @@ -12984,6 +13260,7 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -12997,37 +13274,43 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -13037,6 +13320,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", + "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -13046,6 +13330,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -13055,6 +13340,7 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -13064,6 +13350,7 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -13076,6 +13363,7 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -13091,6 +13379,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -13099,13 +13388,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -13115,6 +13406,7 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -13124,6 +13416,7 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.x" } @@ -13133,6 +13426,7 @@ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "bare-events": "^2.7.0" } @@ -13142,6 +13436,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -13190,7 +13485,8 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/fast-uri": { "version": "3.1.0", @@ -13214,6 +13510,7 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 4.9.1" } @@ -13222,13 +13519,15 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -13250,6 +13549,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -13265,7 +13565,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/follow-redirects": { "version": "1.15.11", @@ -13278,6 +13579,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=4.0" }, @@ -13292,6 +13594,7 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -13308,6 +13611,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", + "peer": true, "engines": { "node": ">=14" }, @@ -13320,6 +13624,7 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", + "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -13336,6 +13641,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -13345,6 +13651,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13357,6 +13664,7 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -13366,6 +13674,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -13374,6 +13683,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", + "peer": true, "dependencies": { "readable-stream": "^1.0.31" }, @@ -13385,13 +13695,15 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "license": "MIT", + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -13403,13 +13715,15 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13419,6 +13733,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", + "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -13428,6 +13743,7 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -13440,6 +13756,7 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -13464,6 +13781,7 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", + "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -13477,6 +13795,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -13489,6 +13808,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "license": "ISC", + "peer": true, "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", @@ -13512,6 +13832,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -13527,6 +13848,7 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -13538,20 +13860,23 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-safari-driver/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -13561,6 +13886,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -13573,6 +13899,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", + "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -13588,6 +13915,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", + "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -13599,7 +13927,8 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/hpack.js": { "version": "2.1.6", @@ -13607,6 +13936,7 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -13619,7 +13949,8 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -13627,6 +13958,7 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13643,6 +13975,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13652,13 +13985,15 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-safari-driver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", + "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -13678,13 +14013,15 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -13710,19 +14047,22 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/appium-safari-driver/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.10" } @@ -13731,13 +14071,15 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", + "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -13753,6 +14095,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -13762,6 +14105,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -13779,13 +14123,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -13798,6 +14144,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -13819,6 +14166,7 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -13833,13 +14181,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/jsftp": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^3.1.0", "ftp-response-parser": "^1.0.1", @@ -13857,6 +14207,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -13865,13 +14216,15 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "license": "(AFL-2.1 OR BSD-3-Clause)", + "peer": true }, "node_modules/appium-safari-driver/node_modules/json-schema-traverse": { "version": "1.0.0", @@ -13885,6 +14238,7 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", "license": "MIT", + "peer": true, "engines": { "node": ">=14.14.0" } @@ -13894,6 +14248,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -13902,13 +14257,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "license": "MIT", + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -13920,13 +14277,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13942,6 +14301,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13951,6 +14311,7 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", + "peer": true, "engines": { "node": ">=14" }, @@ -13962,13 +14323,15 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -13984,6 +14347,7 @@ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "license": "ISC", + "peer": true, "dependencies": { "signal-exit": "^3.0.2" } @@ -14005,6 +14369,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", + "peer": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -14021,6 +14386,7 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -14047,6 +14413,7 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" } @@ -14056,6 +14423,7 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -14065,6 +14433,7 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -14077,6 +14446,7 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", + "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -14092,6 +14462,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14100,13 +14471,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -14116,6 +14489,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -14125,6 +14499,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", + "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -14141,6 +14516,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -14150,7 +14526,8 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-safari-driver/node_modules/minipass": { "version": "7.1.2", @@ -14166,6 +14543,7 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -14175,6 +14553,7 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", + "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -14191,6 +14570,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14199,13 +14579,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14217,13 +14599,15 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "license": "MIT", + "peer": true, "bin": { "ncp": "bin/ncp" } @@ -14233,6 +14617,7 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -14279,6 +14664,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14291,6 +14677,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", + "peer": true, "bin": { "semver": "bin/semver" } @@ -14300,6 +14687,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -14309,6 +14697,7 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -14321,13 +14710,15 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-safari-driver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", + "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14340,6 +14731,7 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -14349,6 +14741,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", + "peer": true, "dependencies": { "wrappy": "1" } @@ -14358,6 +14751,7 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", + "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -14367,6 +14761,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", + "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14382,6 +14777,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", + "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -14405,6 +14801,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -14414,6 +14811,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -14426,6 +14824,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -14441,6 +14840,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -14456,6 +14856,7 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", + "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -14474,6 +14875,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14491,6 +14893,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", + "peer": true, "engines": { "node": ">=0.6.21" } @@ -14500,6 +14903,7 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -14509,6 +14913,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -14518,6 +14923,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -14526,7 +14932,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/path-scurry": { "version": "2.0.1", @@ -14549,6 +14956,7 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -14558,19 +14966,22 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "license": "MIT", + "peer": true, "dependencies": { "find-up": "^5.0.0" }, @@ -14583,6 +14994,7 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "license": "MIT", + "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -14597,6 +15009,7 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -14629,6 +15042,7 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6.0" } @@ -14637,13 +15051,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", + "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -14656,13 +15072,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -14678,6 +15096,7 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -14687,6 +15106,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", + "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -14702,6 +15122,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -14718,6 +15139,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "license": "MIT", + "peer": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -14733,6 +15155,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=8" } @@ -14742,6 +15165,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "license": "MIT", + "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -14772,6 +15196,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -14782,6 +15207,7 @@ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -14791,6 +15217,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -14800,6 +15227,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -14822,6 +15250,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", + "peer": true, "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", @@ -14842,6 +15271,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -14851,6 +15281,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", + "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -14915,6 +15346,7 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -14930,13 +15362,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" } @@ -14945,13 +15379,15 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "license": "WTFPL OR ISC", + "peer": true, "dependencies": { "truncate-utf8-bytes": "^1.0.0" } @@ -14961,7 +15397,8 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true + "optional": true, + "peer": true }, "node_modules/appium-safari-driver/node_modules/semver": { "version": "7.7.3", @@ -14980,6 +15417,7 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -15002,6 +15440,7 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", + "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -15018,6 +15457,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.6" } @@ -15040,13 +15480,15 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", + "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -15067,7 +15509,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/sharp": { "version": "0.34.5", @@ -15076,6 +15519,7 @@ "hasInstallScript": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", @@ -15119,6 +15563,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", + "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15131,6 +15576,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -15152,6 +15598,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -15171,6 +15618,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", + "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -15187,6 +15635,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15205,6 +15654,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15223,7 +15673,8 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/source-map": { "version": "0.6.1", @@ -15249,6 +15700,7 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15258,13 +15710,15 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0" + "license": "CC-BY-3.0", + "peer": true }, "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", + "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15274,7 +15728,8 @@ "version": "3.0.22", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0" + "license": "CC0-1.0", + "peer": true }, "node_modules/appium-safari-driver/node_modules/spdy": { "version": "4.0.2", @@ -15282,6 +15737,7 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15299,6 +15755,7 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -15314,6 +15771,7 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15328,6 +15786,7 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -15337,6 +15796,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -15346,6 +15806,7 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "license": "Unlicense", + "peer": true, "engines": { "node": ">= 0.10.0" } @@ -15355,6 +15816,7 @@ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", "license": "MIT", + "peer": true, "dependencies": { "duplexer": "~0.1.1", "through": "~2.3.4" @@ -15365,6 +15827,7 @@ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", + "peer": true, "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", @@ -15376,6 +15839,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", + "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -15398,13 +15862,15 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", + "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -15423,6 +15889,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15437,6 +15904,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -15445,13 +15913,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15464,6 +15934,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -15480,6 +15951,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15492,6 +15964,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -15501,6 +15974,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15516,6 +15990,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.4" }, @@ -15528,6 +16003,7 @@ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "license": "MIT", + "peer": true, "engines": { "node": ">=20" }, @@ -15540,6 +16016,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "license": "MIT", + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -15567,6 +16044,7 @@ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "b4a": "^1.6.4" } @@ -15575,19 +16053,22 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.6" } @@ -15597,6 +16078,7 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 14.0.0" } @@ -15606,6 +16088,7 @@ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "license": "WTFPL", + "peer": true, "dependencies": { "utf8-byte-length": "^1.0.1" } @@ -15622,6 +16105,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", "license": "(MIT OR CC0-1.0)", + "peer": true, "dependencies": { "tagged-tag": "^1.0.0" }, @@ -15637,6 +16121,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", + "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -15651,6 +16136,7 @@ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", "license": "MIT or GPL-2.0", + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -15660,6 +16146,7 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -15668,13 +16155,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)" + "license": "(WTFPL OR MIT)", + "peer": true }, "node_modules/appium-safari-driver/node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/uuid": { "version": "13.0.0", @@ -15694,6 +16183,7 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", + "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -15704,6 +16194,7 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -15714,6 +16205,7 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -15723,6 +16215,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", + "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -15732,6 +16225,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "license": "ISC", + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -15747,6 +16241,7 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -15769,6 +16264,7 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", + "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -15783,6 +16279,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15797,6 +16294,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15811,6 +16309,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15829,6 +16328,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15846,6 +16346,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -15854,13 +16355,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15875,6 +16378,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15887,6 +16391,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -15895,13 +16400,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15916,6 +16423,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15927,13 +16435,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/appium-safari-driver/node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -15955,6 +16465,7 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", + "peer": true, "engines": { "node": ">=8.0" } @@ -15964,6 +16475,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", + "peer": true, "engines": { "node": ">=10" } @@ -15973,6 +16485,7 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", + "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -15985,6 +16498,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", + "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -16002,6 +16516,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", + "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -16010,13 +16525,15 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -16034,6 +16551,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "license": "MIT", + "peer": true, "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" @@ -16047,6 +16565,7 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "license": "MIT", + "peer": true, "engines": { "node": "*" } @@ -16056,6 +16575,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -16068,6 +16588,7 @@ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "license": "MIT", + "peer": true, "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -17454,49 +17975,12 @@ } }, "node_modules/doc-detective-common": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.6.0.tgz", - "integrity": "sha512-rHZ3WNuw3Y51KduBh9GgnrYFzJdbCQHPP3xnkp+W8QyF+4bKhWFlVVmbotFh/XL3BupbV9+CP7YEBTsW02Hvuw==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.13.2", - "yaml": "^2.8.2" - } - }, - "node_modules/doc-detective-common/node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } + "resolved": "../common", + "link": true }, "node_modules/doc-detective-resolver": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.6.1.tgz", - "integrity": "sha512-8loBGZctT4JWo5PgjYk9b4ZRyJy/Od33KKd5Q+Sa/XEiaQ0e6602e9oI/JDfmnaB1KGUi9qTigezRLIMQlH+Dw==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ajv": "^8.17.1", - "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", - "dotenv": "^17.2.3", - "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" - } + "resolved": "../resolver", + "link": true }, "node_modules/dom-serializer": { "version": "2.0.0", @@ -19118,7 +19602,6 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 10.16.0" } diff --git a/core/package.json b/core/package.json index d1d0c53..5375a88 100644 --- a/core/package.json +++ b/core/package.json @@ -36,8 +36,8 @@ "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", - "doc-detective-resolver": "^3.6.1", + "doc-detective-common": "file:../common", + "doc-detective-resolver": "file:../resolver", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", diff --git a/resolver/package-lock.json b/resolver/package-lock.json index 5cf2118..b98b326 100644 --- a/resolver/package-lock.json +++ b/resolver/package-lock.json @@ -12,7 +12,7 @@ "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", + "doc-detective-common": "file:../common", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", "posthog-node": "^5.17.0" @@ -28,6 +28,29 @@ "yaml": "^2.8.2" } }, + "../common": { + "name": "doc-detective-common", + "version": "3.6.0", + "license": "AGPL-3.0-only", + "dependencies": { + "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/openai": "^2.0.80", + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.108", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "yaml": "^2.8.2", + "zod": "^4.1.13" + }, + "devDependencies": { + "chai": "^6.2.1", + "mocha": "^11.7.5", + "sinon": "^21.0.0" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "15.1.3", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", @@ -233,44 +256,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -702,19 +687,8 @@ } }, "node_modules/doc-detective-common": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.6.0.tgz", - "integrity": "sha512-rHZ3WNuw3Y51KduBh9GgnrYFzJdbCQHPP3xnkp+W8QyF+4bKhWFlVVmbotFh/XL3BupbV9+CP7YEBTsW02Hvuw==", - "license": "AGPL-3.0-only", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.13.2", - "yaml": "^2.8.2" - } + "resolved": "../common", + "link": true }, "node_modules/dotenv": { "version": "17.2.3", @@ -2576,6 +2550,7 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/resolver/package.json b/resolver/package.json index da39660..8ef3a0c 100644 --- a/resolver/package.json +++ b/resolver/package.json @@ -27,7 +27,7 @@ "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "axios": "^1.13.2", - "doc-detective-common": "^3.6.0", + "doc-detective-common": "file:../common", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", "posthog-node": "^5.17.0" From 3cc926dfe0b8e7522cb9c75687daaf1171ec4927 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Tue, 9 Dec 2025 09:13:18 -0800 Subject: [PATCH 60/90] Add synthesized user input tests --- cli/test/builder/inlineSourceUpdates.test.mjs | 977 ++++++++++++++++++ 1 file changed, 977 insertions(+) create mode 100644 cli/test/builder/inlineSourceUpdates.test.mjs diff --git a/cli/test/builder/inlineSourceUpdates.test.mjs b/cli/test/builder/inlineSourceUpdates.test.mjs new file mode 100644 index 0000000..c900814 --- /dev/null +++ b/cli/test/builder/inlineSourceUpdates.test.mjs @@ -0,0 +1,977 @@ +/** + * Tests for inline source file updates - simulating user inputs to update markdown files + * + * Tests the complete flow of: + * 1. Creating markdown files with inline statements + * 2. Modifying the statements (simulating user edits) + * 3. Writing the updates back to the file + * 4. Verifying the output matches expected format + * + * Each test validates: + * - Comment types: htmlComment, jsxComment, linkReference + * - Syntax types: json, yaml, xml + */ + +import { createRequire } from 'module'; +import * as fs from 'fs'; +import * as path from 'path'; +import { fileURLToPath } from 'url'; + +const require = createRequire(import.meta.url); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const { + serializeStepToInline, + serializeTestToInline, + detectSyntaxFormat, + serializeToSyntax, + getDefaultCommentFormat, + prepareSourceUpdates, + batchUpdateSourceContent, +} = require('../../src/cli/builder/sourceFileUtils.js'); + +import { + getMockSpec, + getMockTest, + getMockGoToStep, + getMockClickStep, + getMockSourceLocation, + getMockInlineStep, +} from './fixtures.mjs'; + +// Use dynamic import for chai to support ESM +let expect; +before(async function () { + const chai = await import('chai'); + expect = chai.expect; + global.expect = expect; +}); + +describe('Inline Source Updates - User Input Simulation', function () { + // Temp file handling + const tempDir = path.join(__dirname, 'temp-inline'); + + before(function () { + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + } + }); + + afterEach(function () { + // Clean up temp files after each test + if (fs.existsSync(tempDir)) { + const files = fs.readdirSync(tempDir); + for (const file of files) { + fs.unlinkSync(path.join(tempDir, file)); + } + } + }); + + after(function () { + // Remove temp directory + if (fs.existsSync(tempDir)) { + fs.rmdirSync(tempDir); + } + }); + + describe('Comment Type: htmlComment', function () { + describe('with JSON syntax', function () { + it('creates and updates a markdown file with HTML comment JSON step', function () { + const tempFile = path.join(tempDir, 'html-json-step.md'); + const originalContent = `# Test Documentation + +This is a test document. + + + +More content here. +`; + fs.writeFileSync(tempFile, originalContent); + + // Simulate user modifying the step + const modifiedStep = { + goTo: 'https://modified.com', + sourceLocation: { + file: tempFile, + isInline: true, + startOffset: originalContent.indexOf(''.length, + commentFormat: 'htmlComment', + originalText: '', + }, + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'htmlComment', + originalText: '', + }); + + // Verify serialization preserves JSON format + expect(serialized).to.match(/^$/); + expect(serialized).to.include('goTo'); + expect(serialized).to.include('https://modified.com'); + + // Apply update to file + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset: modifiedStep.sourceLocation.startOffset, + endOffset: modifiedStep.sourceLocation.endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + // Verify file content + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('https://modified.com'); + expect(updatedContent).to.not.include('https://original.com'); + expect(updatedContent).to.include(''); + }); + + it('creates and updates a test declaration with HTML comment JSON', function () { + const tempFile = path.join(tempDir, 'html-json-test.md'); + const originalContent = `# Test Documentation + + + + +`; + fs.writeFileSync(tempFile, originalContent); + + const modifiedTest = { + testId: 'modified-test', + description: 'Modified description', + steps: [], + }; + + const serialized = serializeTestToInline({ + test: modifiedTest, + commentFormat: 'htmlComment', + originalText: '', + }); + + expect(serialized).to.match(/^') + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('modified-test'); + expect(updatedContent).to.include('Modified description'); + }); + }); + + describe('with YAML syntax', function () { + it('creates and updates a markdown file with HTML comment YAML step', function () { + const tempFile = path.join(tempDir, 'html-yaml-step.md'); + const originalContent = `# Test Documentation + + + +More content. +`; + fs.writeFileSync(tempFile, originalContent); + + // Detect original syntax + const detectedSyntax = detectSyntaxFormat(''); + expect(detectedSyntax).to.equal('yaml'); + + const modifiedStep = { + goTo: 'https://modified.com', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'htmlComment', + originalText: '', + }); + + // Verify YAML format is preserved + expect(serialized).to.match(/^') + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('https://modified.com'); + expect(updatedContent).to.include('goTo:'); + }); + + it('creates and updates multiline YAML step', function () { + const tempFile = path.join(tempDir, 'html-yaml-multiline.md'); + const originalContent = `# Test Documentation + + + +More content. +`; + fs.writeFileSync(tempFile, originalContent); + + const detectedSyntax = detectSyntaxFormat(originalContent.substring( + originalContent.indexOf('') + 3 + )); + expect(detectedSyntax).to.equal('yaml'); + + // Serialize with object form to get multiline YAML + const modifiedStep = { + goTo: { + url: 'https://modified.com', + timeout: 5000, + }, + }; + + const yamlContent = serializeToSyntax(modifiedStep, 'yaml', 'step'); + expect(yamlContent).to.include('\n'); + expect(yamlContent).to.include('goTo:'); + }); + + it('creates and updates a test declaration with HTML comment YAML', function () { + const tempFile = path.join(tempDir, 'html-yaml-test.md'); + const originalContent = `# Test Documentation + + + + +`; + fs.writeFileSync(tempFile, originalContent); + + const modifiedTest = { + testId: 'modified-test', + description: 'Added description', + }; + + const serialized = serializeTestToInline({ + test: modifiedTest, + commentFormat: 'htmlComment', + originalText: '', + }); + + expect(serialized).to.include('testId:'); + expect(serialized).to.include('modified-test'); + + const startOffset = originalContent.indexOf(''.length, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('modified-test'); + }); + }); + + describe('with XML syntax', function () { + it('creates and updates a markdown file with HTML comment XML step', function () { + const tempFile = path.join(tempDir, 'html-xml-step.md'); + const originalContent = `# Test Documentation + + + +More content. +`; + fs.writeFileSync(tempFile, originalContent); + + const detectedSyntax = detectSyntaxFormat(''); + expect(detectedSyntax).to.equal('xml'); + + // Serialize to XML format + const xmlContent = serializeToSyntax({ goTo: 'https://modified.com' }, 'xml', 'step'); + expect(xmlContent).to.equal('goTo="https://modified.com"'); + + // Full serialization for step + const serialized = ``; + + const startOffset = originalContent.indexOf('') + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('goTo="https://modified.com"'); + expect(updatedContent).to.not.include('https://original.com'); + }); + + it('serializes boolean and number values correctly in XML format', function () { + const xmlContent = serializeToSyntax({ enabled: true, timeout: 5000 }, 'xml', 'step'); + + expect(xmlContent).to.include('enabled=true'); + expect(xmlContent).to.include('timeout=5000'); + }); + + it('creates and updates a test declaration with HTML comment XML', function () { + const tempFile = path.join(tempDir, 'html-xml-test.md'); + const originalContent = `# Test Documentation + + + + +`; + fs.writeFileSync(tempFile, originalContent); + + const detectedSyntax = detectSyntaxFormat(''); + expect(detectedSyntax).to.equal('xml'); + + const xmlContent = serializeToSyntax({ testId: 'modified-test', description: 'New description' }, 'xml', 'test'); + expect(xmlContent).to.include('testId="modified-test"'); + expect(xmlContent).to.include('description="New description"'); + }); + }); + }); + + describe('Comment Type: jsxComment', function () { + describe('with JSON syntax', function () { + it('creates and updates a JSX file with JSX comment JSON step', function () { + const tempFile = path.join(tempDir, 'jsx-json-step.jsx'); + const originalContent = `export default function Page() { + return ( +
+ {/* step {"goTo":"https://original.com"} */} +

Hello World

+
+ ); +} +`; + fs.writeFileSync(tempFile, originalContent); + + // Verify default comment format for JSX + expect(getDefaultCommentFormat('.jsx')).to.equal('jsxComment'); + + const modifiedStep = { + goTo: 'https://modified.com', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'jsxComment', + originalText: '{/* step {"goTo":"https://original.com"} */}', + }); + + expect(serialized).to.match(/^\{\s*\/\*/); + expect(serialized).to.match(/\*\/\s*\}$/); + expect(serialized).to.include('https://modified.com'); + + const startOffset = originalContent.indexOf('{/* step'); + const endOffset = originalContent.indexOf('*/}') + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: serialized, + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('https://modified.com'); + expect(updatedContent).to.include('{/*'); + expect(updatedContent).to.include('*/}'); + }); + + it('creates and updates a TSX file with JSX comment', function () { + const tempFile = path.join(tempDir, 'tsx-json-step.tsx'); + const originalContent = `import React from 'react'; + +export const Component: React.FC = () => { + return ( +
+ {/* step {"click":".button"} */} + +
+ ); +}; +`; + fs.writeFileSync(tempFile, originalContent); + + expect(getDefaultCommentFormat('.tsx')).to.equal('jsxComment'); + + const modifiedStep = { + click: '.new-button', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'jsxComment', + }); + + expect(serialized).to.include('{/*'); + expect(serialized).to.include('*/}'); + expect(serialized).to.include('.new-button'); + }); + + it('creates and updates an MDX file with JSX comment', function () { + const tempFile = path.join(tempDir, 'mdx-json-step.mdx'); + const originalContent = `# Documentation + +{/* step {"goTo":"https://original.com"} */} + + +`; + fs.writeFileSync(tempFile, originalContent); + + expect(getDefaultCommentFormat('.mdx')).to.equal('jsxComment'); + + const modifiedStep = { + goTo: 'https://modified.com', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'jsxComment', + }); + + expect(serialized).to.include('{/*'); + expect(serialized).to.include('*/}'); + }); + }); + + describe('with YAML syntax', function () { + it('creates and updates a JSX file with JSX comment YAML step', function () { + const tempFile = path.join(tempDir, 'jsx-yaml-step.jsx'); + const originalContent = `export default function Page() { + return ( +
+ {/* step goTo: https://original.com */} +

Hello World

+
+ ); +} +`; + fs.writeFileSync(tempFile, originalContent); + + // Detect the syntax from JSX comment + const detectedSyntax = detectSyntaxFormat('{/* step goTo: https://original.com */}'); + expect(detectedSyntax).to.equal('yaml'); + + const modifiedStep = { + goTo: 'https://modified.com', + }; + + const serialized = serializeStepToInline({ + step: modifiedStep, + commentFormat: 'jsxComment', + originalText: '{/* step goTo: https://original.com */}', + }); + + expect(serialized).to.include('{/*'); + expect(serialized).to.include('*/}'); + expect(serialized).to.include('goTo:'); + }); + }); + + describe('with multiline content', function () { + it('creates multiline JSX comment for complex steps', function () { + const complexStep = { + goTo: { + url: 'https://example.com', + timeout: 5000, + }, + }; + + const yamlContent = serializeToSyntax(complexStep, 'yaml', 'step'); + expect(yamlContent).to.include('\n'); + + // Multiline JSX comment format + const multilineJsx = `{/* step\n${yamlContent}\n*/}`; + expect(multilineJsx).to.include('{/* step'); + expect(multilineJsx).to.include('*/}'); + }); + }); + }); + + describe('Comment Type: linkReference', function () { + describe('with JSON syntax', function () { + it('serializes step to link reference format', function () { + const step = { + goTo: 'https://example.com', + }; + + const serialized = serializeStepToInline({ + step, + commentFormat: 'linkReference', + }); + + expect(serialized).to.include('[comment]: #'); + expect(serialized).to.include('step'); + }); + + it('falls back to JSON for multiline content in link reference', function () { + // Link reference format doesn't support multiline well + const complexStep = { + goTo: 'https://example.com', + description: 'Navigate to page', + stepId: 'nav-step', + }; + + const serialized = serializeStepToInline({ + step: complexStep, + commentFormat: 'linkReference', + }); + + expect(serialized).to.include('[comment]: #'); + // Should use JSON stringify for complex content + expect(serialized).to.include('{'); + }); + }); + }); + + describe('Full Update Flow - prepareSourceUpdates', function () { + it('prepares updates for modified inline steps', function () { + const tempFile = path.join(tempDir, 'prepare-updates.md'); + + const originalSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://original.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + commentFormat: 'htmlComment', + originalText: '', + }), + ], + }], + }); + + const modifiedSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://modified.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + commentFormat: 'htmlComment', + originalText: '', + }), + ], + }], + }); + + const updates = prepareSourceUpdates({ spec: modifiedSpec, originalSpec }); + + expect(updates.size).to.equal(1); + expect(updates.has(tempFile)).to.be.true; + + const fileUpdates = updates.get(tempFile); + expect(fileUpdates).to.be.an('array'); + expect(fileUpdates.length).to.equal(1); + expect(fileUpdates[0]).to.have.property('newContent'); + expect(fileUpdates[0].newContent).to.include('https://modified.com'); + }); + + it('skips unmodified steps', function () { + const tempFile = path.join(tempDir, 'skip-unmodified.md'); + + const spec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://example.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + }), + ], + }], + }); + + // Deep clone to create identical original + const originalSpec = JSON.parse(JSON.stringify(spec)); + + const updates = prepareSourceUpdates({ spec, originalSpec }); + + expect(updates.size).to.equal(0); + }); + + it('handles auto-detected steps with insertLineAfter', function () { + const tempFile = path.join(tempDir, 'auto-detected.md'); + + const originalSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://original.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + isAutoDetected: true, + }), + ], + }], + }); + + const modifiedSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://modified.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + isAutoDetected: true, + }), + ], + }], + }); + + const updates = prepareSourceUpdates({ spec: modifiedSpec, originalSpec }); + + expect(updates.size).to.equal(1); + const fileUpdates = updates.get(tempFile); + expect(fileUpdates[0]).to.have.property('insertLineAfter', true); + }); + + it('inserts new test declaration when test has metadata but no source location', function () { + const tempFile = path.join(tempDir, 'new-test-decl.md'); + + const originalSpec = getMockSpec({ + tests: [{ + testId: 'new-test', + description: 'New test description', + steps: [ + getMockInlineStep('goTo', 'https://example.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + commentFormat: 'htmlComment', + }), + ], + }], + }); + + // Original has no test metadata + const emptyOriginalSpec = getMockSpec({ + tests: [{ + steps: [ + getMockInlineStep('goTo', 'https://example.com', { + file: tempFile, + startOffset: 50, + endOffset: 100, + commentFormat: 'htmlComment', + }), + ], + }], + }); + + const updates = prepareSourceUpdates({ spec: originalSpec, originalSpec: emptyOriginalSpec }); + + expect(updates.size).to.equal(1); + const fileUpdates = updates.get(tempFile); + + // Should have a test declaration insertion + const testDeclUpdate = fileUpdates.find(u => u.isNewTestDeclaration); + expect(testDeclUpdate).to.exist; + expect(testDeclUpdate.insertLineBefore).to.be.true; + }); + }); + + describe('Complete File Update Workflow', function () { + it('updates markdown file with multiple inline steps', function () { + const tempFile = path.join(tempDir, 'complete-workflow.md'); + const originalContent = `# Documentation + +This is an introduction. + + + +Navigate to the homepage: + + +Click the button: + + +Take a screenshot: + + +Done! +`; + fs.writeFileSync(tempFile, originalContent); + + // Find offsets for each step + const step1Start = originalContent.indexOf('', step1Start) + 3; + + const step2Start = originalContent.indexOf('', step2Start) + 3; + + const step3Start = originalContent.indexOf('', step3Start) + 3; + + // Create updates + const updates = [ + { + startOffset: step1Start, + endOffset: step1End, + newContent: '', + replaceEntireLine: true, + }, + { + startOffset: step2Start, + endOffset: step2End, + newContent: '', + replaceEntireLine: true, + }, + { + startOffset: step3Start, + endOffset: step3End, + newContent: '', + replaceEntireLine: true, + }, + ]; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates, + }); + + expect(result.success).to.be.true; + expect(result.results).to.have.lengthOf(3); + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + expect(updatedContent).to.include('https://modified1.com'); + expect(updatedContent).to.include('.modified-button'); + expect(updatedContent).to.include('modified.png'); + expect(updatedContent).to.not.include('https://original1.com'); + expect(updatedContent).to.not.include('.original-button'); + expect(updatedContent).to.not.include('original.png'); + + // Verify structure is preserved + expect(updatedContent).to.include('# Documentation'); + expect(updatedContent).to.include('Navigate to the homepage:'); + expect(updatedContent).to.include('Click the button:'); + expect(updatedContent).to.include('Take a screenshot:'); + expect(updatedContent).to.include('Done!'); + }); + + it('handles mixed comment and syntax formats in same file', function () { + const tempFile = path.join(tempDir, 'mixed-formats.md'); + const originalContent = `# Mixed Format Documentation + + + +JSON format step: + + +YAML format step (unquoted value for clear YAML detection): + + +XML format step: + + +`; + fs.writeFileSync(tempFile, originalContent); + + // Verify syntax detection + // JSON: starts with { or has quoted key/value patterns + expect(detectSyntaxFormat('')).to.equal('json'); + // YAML: key: value without JSON-like quotes - using numeric value for clear detection + expect(detectSyntaxFormat('')).to.equal('yaml'); + // XML: key="value" or key=value attribute syntax + expect(detectSyntaxFormat('')).to.equal('xml'); + + // Create serialized updates preserving each format + const jsonStep = serializeStepToInline({ + step: { goTo: 'https://json-modified.com' }, + commentFormat: 'htmlComment', + originalText: '', + }); + + const yamlStep = serializeStepToInline({ + step: { wait: 3000 }, + commentFormat: 'htmlComment', + originalText: '', + }); + + // Verify formats are preserved + expect(jsonStep).to.include('goTo:'); // Simple format uses YAML-like syntax + expect(yamlStep).to.include('wait:'); + }); + + it('preserves indentation when updating steps', function () { + const tempFile = path.join(tempDir, 'preserve-indent.md'); + const originalContent = `# Indented Documentation + + This section is indented. + + + + More indented content. +`; + fs.writeFileSync(tempFile, originalContent); + + const startOffset = originalContent.indexOf(' ', startOffset) + 3; + + const result = batchUpdateSourceContent({ + filePath: tempFile, + updates: [{ + startOffset, + endOffset, + newContent: '', + replaceEntireLine: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + // Indentation should be preserved + expect(updatedContent).to.include(' '); + }); + + it('handles inserting new lines before and after existing content', function () { + const tempFile = path.join(tempDir, 'insert-lines.md'); + const originalContent = `# Documentation + + + +`; + fs.writeFileSync(tempFile, originalContent); + + const stepOffset = originalContent.indexOf('', + insertLineBefore: true, + }], + }); + + expect(result.success).to.be.true; + + const updatedContent = fs.readFileSync(tempFile, 'utf8'); + const testPos = updatedContent.indexOf('', + }], + }); + + expect(result.success).to.be.true; + + const content = fs.readFileSync(tempFile, 'utf8'); + expect(content).to.equal(''); + }); + + it('handles special characters in URLs', function () { + const step = { goTo: 'https://example.com/path?query=value&other=123#section' }; + + const jsonSerialized = serializeToSyntax(step, 'json', 'step'); + expect(jsonSerialized).to.include('https://example.com/path?query=value&other=123#section'); + + const yamlSerialized = serializeToSyntax(step, 'yaml', 'step'); + expect(yamlSerialized).to.include('goTo:'); + }); + + it('handles quotes in values', function () { + const step = { find: '[data-test="my-element"]' }; + + const jsonSerialized = serializeToSyntax(step, 'json', 'step'); + expect(jsonSerialized).to.include('\\"my-element\\"'); + + const yamlSerialized = serializeToSyntax(step, 'yaml', 'step'); + expect(yamlSerialized).to.include('data-test'); + }); + + it('handles Unicode characters', function () { + const step = { type: ['Hello 世界 🌍'] }; + + const serialized = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(serialized).to.include('世界'); + expect(serialized).to.include('🌍'); + }); + + it('handles very long URLs', function () { + const longUrl = 'https://example.com/' + 'a'.repeat(500); + const step = { goTo: longUrl }; + + const serialized = serializeStepToInline({ + step, + commentFormat: 'htmlComment', + }); + + expect(serialized).to.include(longUrl); + }); + }); +}); From 768d54d3785246a22bec9e3de8aa325771c8a6a3 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Tue, 9 Dec 2025 10:09:10 -0800 Subject: [PATCH 61/90] Exclude internal metadata from common step properties in StepEditor --- cli/src/cli/builder/StepEditor.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/cli/builder/StepEditor.mjs b/cli/src/cli/builder/StepEditor.mjs index 39c39e3..3c6a78c 100644 --- a/cli/src/cli/builder/StepEditor.mjs +++ b/cli/src/cli/builder/StepEditor.mjs @@ -201,9 +201,9 @@ const StepEditor = ({ } } - // Add common step properties that are set + // Add common step properties that are set (excluding internal metadata like sourceLocation) Object.entries(localStep).forEach(([key, val]) => { - if (key !== stepType && commonProps[key]) { + if (key !== stepType && key !== 'sourceLocation' && commonProps[key]) { result.push({ name: key, value: val, From f8837231dc3cbe2723bcda8191fc32f8fa2e9b50 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Tue, 9 Dec 2025 16:01:11 -0800 Subject: [PATCH 62/90] Add refineStep() --- common/dev/dev.js | 46 +-- common/dist/schemas/config_v3.schema.json | 24 ++ .../dist/schemas/resolvedTests_v3.schema.json | 24 ++ common/src/ai.js | 55 ++- common/src/index.js | 5 +- common/src/refineStep.js | 267 ++++++++++++ .../output_schemas/config_v3.schema.json | 24 ++ .../resolvedTests_v3.schema.json | 24 ++ common/src/schemas/schemas.json | 48 +++ .../schemas/src_schemas/config_v3.schema.json | 24 ++ common/test/ai.test.js | 55 +++ common/test/refineStep.test.js | 382 ++++++++++++++++++ 12 files changed, 943 insertions(+), 35 deletions(-) create mode 100644 common/src/refineStep.js create mode 100644 common/test/refineStep.test.js diff --git a/common/dev/dev.js b/common/dev/dev.js index f67d9d1..cebaacf 100644 --- a/common/dev/dev.js +++ b/common/dev/dev.js @@ -1,31 +1,21 @@ -const { validate, schemas } = require("../src/index"); +const { validate, schemas, refineStep } = require("../src/index"); -const object = { - tests: [ - { - steps: [ - { - goTo: { - url: "http://localhost:8092", - waitUntil: { - find: { - selector: "button", - elementText: "Standard Button", - elementTestId: "standard-btn", - elementAria: "Sample Standard Button", - elementId: "standard-btn", - elementClass: ["btn"], - elementAttribute: { - type: "button", - value: "Standard Button", - }, - }, - }, - }, - }, - ], - }, - ], +(async () => { + +const originalStep = { + stepId: "step-123", + find: { selector: ".old-button-class" }, }; -console.log(validate({ schemaKey: "spec_v3", object })); +const refinedStep = await refineStep({ + step: originalStep, + failureMessage: "Element not found: .old-button-class", + context: { + dom: ` + + `, + }, +}); +console.log(refinedStep); +})(); + diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index f984e84..88f0c45 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -10394,6 +10394,30 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openai": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" } }, "title": "Integrations options" diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index 5140171..8765100 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -10407,6 +10407,30 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openai": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" } }, "title": "Integrations options" diff --git a/common/src/ai.js b/common/src/ai.js index 370cc5d..b38967c 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -174,7 +174,7 @@ const validateAgainstZodSchema = (object, schema) => { * @returns {{ valid: boolean, errors: string | null, object: Object }} Validation result. */ const validateAgainstJsonSchema = (object, schema) => { - const ajv = new Ajv({ allErrors: true, useDefaults: true, coerceTypes: true }); + const ajv = new Ajv({ allErrors: true, useDefaults: true, coerceTypes: true, strict: false }); addFormats(ajv); const validate = ajv.compile(schema); @@ -217,6 +217,26 @@ const toAiSdkSchema = (schema) => { return jsonSchema(schema); }; +/** + * Extracts the API key for a provider from a Doc Detective config object. + * @param {Object} config - The Doc Detective configuration object. + * @param {"openai" | "anthropic"} provider - The provider name. + * @returns {string | undefined} The API key if found. + */ +const getApiKey = (config, provider) => { + if (!config || !config.integrations) return undefined; + + if (provider === "anthropic" && (process.env.ANTHROPIC_API_KEY || config.integrations.anthropic)) { + return process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey; + } + + if (provider === "openai" && (process.env.OPENAI_API_KEY || config.integrations.openai)) { + return process.env.OPENAI_API_KEY || config.integrations.openai.apiKey; + } + + return undefined; +}; + /** * Generates text or structured output using an AI model. * @@ -233,7 +253,8 @@ const toAiSdkSchema = (schema) => { * @param {string} [options.schemaName] - Name for the schema (used in API calls). * @param {string} [options.schemaDescription] - Description for the schema. * @param {"openai" | "anthropic"} [options.provider] - Explicit provider override. - * @param {string} [options.apiKey] - API key override (falls back to env vars). + * @param {Object} [options.config] - Doc Detective config object with integrations.anthropic/openai API keys. + * @param {string} [options.apiKey] - API key override (takes precedence over config and env vars). * @param {string} [options.baseURL] - Base URL override for the provider. * @param {number} [options.temperature] - Temperature for generation. * @param {number} [options.maxTokens] - Maximum tokens to generate. @@ -255,6 +276,7 @@ const generate = async ({ schemaName, schemaDescription, provider, + config, apiKey, baseURL, temperature, @@ -265,7 +287,7 @@ const generate = async ({ throw new Error("Either 'prompt' or 'messages' is required."); } - // Determine provider and model + // Determine provider, model, and API key const detected = detectProvider(model); const resolvedProvider = provider || detected.provider; const resolvedModel = detected.model || model; @@ -276,10 +298,13 @@ const generate = async ({ ); } + // Resolve API key: explicit apiKey > config > env vars (handled by SDK) + const resolvedApiKey = apiKey || getApiKey(config, resolvedProvider); + // Create provider instance const providerFactory = createProvider({ provider: resolvedProvider, - apiKey, + apiKey: resolvedApiKey, baseURL, }); @@ -377,6 +402,20 @@ const generateWithSchemaValidation = async ({ }) => { let lastError = null; let lastObject = null; + let wrappedSchema = false; + + // If JSON schema with allOf/anyOf/oneOf at the top level, wrap it in an object + if (!isZodSchema(schema) && (schema.allOf || schema.anyOf || schema.oneOf)) { + schema = { + type: "object", + properties: { + object: schema, + }, + required: ["object"], + additionalProperties: false, + }; + wrappedSchema = true; + } // Convert schema to AI SDK format (wraps JSON schemas with jsonSchema()) const aiSdkSchema = toAiSdkSchema(schema); @@ -415,12 +454,15 @@ const generateWithSchemaValidation = async ({ try { const result = await generateObject(objectOptions); + const validationObject = wrappedSchema ? result.object.object : result.object; + const validationSchema = wrappedSchema ? schema.properties.object : schema; + // Validate the generated object against the schema ourselves - const validation = validateAgainstSchema(result.object, schema); + const validation = validateAgainstSchema(validationObject, validationSchema); if (validation.valid) { return { - object: validation.object, + object: validationObject, usage: result.usage, finishReason: result.finishReason, }; @@ -456,6 +498,7 @@ module.exports = { generate, detectProvider, detectModel, + getApiKey, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, diff --git a/common/src/index.js b/common/src/index.js index 8afa1a5..eb1a8e7 100644 --- a/common/src/index.js +++ b/common/src/index.js @@ -2,7 +2,8 @@ const { schemas } = require("./schemas"); const { validate, transformToSchemaKey } = require("./validate"); const { resolvePaths } = require("./resolvePaths"); const { readFile } = require("./files"); -const { generate, detectProvider, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); +const { generate, detectProvider, getApiKey, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); +const { refineStep } = require("./refineStep"); module.exports = { schemas, @@ -12,6 +13,8 @@ module.exports = { transformToSchemaKey, generate, detectProvider, + getApiKey, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, + refineStep, }; diff --git a/common/src/refineStep.js b/common/src/refineStep.js new file mode 100644 index 0000000..ff7009b --- /dev/null +++ b/common/src/refineStep.js @@ -0,0 +1,267 @@ +const { generate } = require("./ai"); +const { schemas } = require("./schemas"); +const { validate } = require("./validate"); + +const DEFAULT_MAX_CONTEXT_LENGTH = 50000; + +/** + * System prompt for refining Doc Detective steps. + */ +const REFINE_STEP_SYSTEM_PROMPT = `You are a Doc Detective step refinement expert. Your task is to revise a test step to make it pass based on the provided context. + +When refining steps: +1. Analyze any failure messages to understand why the step failed +2. Use the provided context (DOM, CLI output, HTTP response, screenshots) to inform corrections +3. Maintain the original intent of the step while fixing issues +4. Prefer precise CSS selectors when fixing element-related steps +5. Ensure all required fields are present and valid +6. If the step type seems wrong for the context, suggest a more appropriate action type + +Available action types: +- goTo: Navigate to a URL +- find: Locate an element on the page (can include click, type, moveTo, scroll actions) +- click: Click an element +- type: Type text or send keys +- checkLink: Verify a URL returns acceptable status codes +- httpRequest: Make an HTTP request and validate the response +- runShell: Execute a shell command +- runCode: Execute code in a supported language +- screenshot: Capture a screenshot +- wait: Wait for a specified duration +- saveCookie/loadCookie: Cookie management +- record/stopRecord: Video recording +- loadVariables: Load environment variables +- dragAndDrop: Drag and drop elements + +Preserve the stepId and sourceLocation if provided. Return a complete, valid step object.`; + +/** + * Builds the refinement prompt from the provided step and context. + * @param {Object} options + * @param {Object} options.step - The step to refine + * @param {string} [options.sourceContent] - Source documentation content + * @param {Array} [options.previousSteps] - Previously executed steps + * @param {string} [options.failureMessage] - Error message if step failed + * @param {Object} [options.context] - Additional context (DOM, CLI output, HTTP response) + * @param {number} [options.maxContextLength] - Maximum context length before truncation + * @returns {string} The formatted prompt + */ +const buildRefinementPrompt = ({ + step, + sourceContent, + previousSteps, + failureMessage, + context, + maxContextLength = DEFAULT_MAX_CONTEXT_LENGTH, +}) => { + const sections = []; + + // Current step + sections.push("## Step to Refine\n```json\n" + JSON.stringify(step, null, 2) + "\n```"); + + // Failure message if present + if (failureMessage) { + sections.push("## Failure Message\n" + failureMessage); + } + + // Source content if present + if (sourceContent) { + const truncatedSource = truncateContent(sourceContent, Math.floor(maxContextLength / 3)); + sections.push("## Source Documentation\n" + truncatedSource); + } + + // Previous steps if present + if (previousSteps && previousSteps.length > 0) { + const stepsJson = JSON.stringify(previousSteps, null, 2); + const truncatedSteps = truncateContent(stepsJson, Math.floor(maxContextLength / 4)); + sections.push("## Previously Executed Steps\n```json\n" + truncatedSteps + "\n```"); + } + + // Additional context + if (context) { + const contextSections = []; + + if (context.dom) { + const truncatedDom = truncateContent(context.dom, Math.floor(maxContextLength / 3)); + contextSections.push("### Browser DOM\n```html\n" + truncatedDom + "\n```"); + } + + if (context.element) { + const truncatedElement = truncateContent( + typeof context.element === "string" ? context.element : JSON.stringify(context.element, null, 2), + Math.floor(maxContextLength / 4) + ); + contextSections.push("### Target Element\n```\n" + truncatedElement + "\n```"); + } + + if (context.cliOutput) { + const truncatedCli = truncateContent(context.cliOutput, Math.floor(maxContextLength / 4)); + contextSections.push("### CLI Output\n```\n" + truncatedCli + "\n```"); + } + + if (context.httpResponse) { + const responseStr = typeof context.httpResponse === "string" + ? context.httpResponse + : JSON.stringify(context.httpResponse, null, 2); + const truncatedHttp = truncateContent(responseStr, Math.floor(maxContextLength / 4)); + contextSections.push("### HTTP Response\n```json\n" + truncatedHttp + "\n```"); + } + + if (context.accessibility) { + const accessStr = typeof context.accessibility === "string" + ? context.accessibility + : JSON.stringify(context.accessibility, null, 2); + const truncatedAccess = truncateContent(accessStr, Math.floor(maxContextLength / 4)); + contextSections.push("### Accessibility Tree\n```\n" + truncatedAccess + "\n```"); + } + + if (contextSections.length > 0) { + sections.push("## Current Context\n" + contextSections.join("\n\n")); + } + } + + sections.push("## Task\nRefine the step above to make it pass based on the provided context. Return only the refined step object."); + + return sections.join("\n\n"); +}; + +/** + * Truncates content to a maximum length, adding an indicator if truncated. + * @param {string} content - The content to truncate + * @param {number} maxLength - Maximum length + * @returns {string} The truncated content + */ +const truncateContent = (content, maxLength) => { + if (!content || content.length <= maxLength) { + return content; + } + return content.substring(0, maxLength) + "\n\n[Content truncated...]"; +}; + +/** + * Refines a Doc Detective step using AI to make it pass the current context. + * + * @param {Object} options - Refinement options + * @param {Object} options.step - The step to refine (required) + * @param {string} [options.sourceContent] - Source documentation content (recommended) + * @param {Array} [options.previousSteps] - Previously executed steps for context + * @param {string} [options.failureMessage] - Error message if the step failed previously + * @param {Object} [options.context] - Additional context object + * @param {string} [options.context.dom] - Browser DOM snapshot + * @param {string|Object} [options.context.element] - Specific element information + * @param {string} [options.context.cliOutput] - CLI command output + * @param {string|Object} [options.context.httpResponse] - HTTP response data + * @param {string|Object} [options.context.accessibility] - Accessibility tree snapshot + * @param {Object} [options.config] - Doc Detective configuration object + * @param {Object} [options.config.integrations] - Integration configurations + * @param {Object} [options.config.integrations.anthropic] - Anthropic configuration + * @param {string} [options.config.integrations.anthropic.apiKey] - Anthropic API key + * @param {Object} [options.config.integrations.openai] - OpenAI configuration + * @param {string} [options.config.integrations.openai.apiKey] - OpenAI API key + * @param {Object} [options.config.ai] - Legacy AI configuration (deprecated, use integrations) + * @param {string} [options.config.ai.model] - LLM model to use + * @param {string} [options.config.ai.apiKey] - API key for the LLM provider (deprecated) + * @param {string} [options.config.ai.baseURL] - Base URL for the LLM provider + * @param {string} [options.model] - LLM model override (takes precedence over config) + * @param {Array} [options.files] - Screenshots or images for multimodal analysis + * @param {number} [options.maxContextLength] - Maximum context length before truncation (default: 50000) + * @returns {Promise} A promise that resolves to a refined step_v3 compatible step + * @throws {Error} If step is not provided or refinement fails + * + * @example + * const refinedStep = await refineStep({ + * step: { find: { selector: ".old-class" } }, + * failureMessage: "Element not found: .old-class", + * context: { dom: "..." }, + * config: { integrations: { anthropic: { apiKey: "sk-..." } } } + * }); + */ +const refineStep = async ({ + step, + sourceContent, + previousSteps, + failureMessage, + context, + config = {}, + model, + files, + maxContextLength = DEFAULT_MAX_CONTEXT_LENGTH, +}) => { + // Validate required input + if (!step || typeof step !== "object") { + throw new Error("'step' is required and must be an object."); + } + + // Extract AI configuration (support both legacy config.ai and new config.integrations) + const aiConfig = {}; + const resolvedModel = model || aiConfig.model; + const baseURL = aiConfig.baseURL; + + // Build the prompt + const prompt = buildRefinementPrompt({ + step, + sourceContent, + previousSteps, + failureMessage, + context, + maxContextLength, + }); + + // Get the step schema for structured output + // Wrap the step schema in an object to move anyOf/oneOf down a level + // This is required because Anthropic's API doesn't support anyOf/oneOf/allOf at the top level + const stepSchema = schemas.step_v3; + + // Generate the refined step using AI + // Pass config for integrations API keys, generate() will extract the right one + const result = await generate({ + prompt, + system: REFINE_STEP_SYSTEM_PROMPT, + schema: stepSchema, + schemaName: "step", + schemaDescription: "An object containing a Doc Detective test step", + model: resolvedModel, + config, + baseURL, + files, + }); + + // Extract the step from the wrapper and post-process + const refinedStep = postProcessStep(result.object, step); + + // Validate the step against the schema + const validation = validate({schemaKey: "step_v3", object: refinedStep}); + if (!validation.valid) { + throw new Error(`Refined step failed validation: ${JSON.stringify(validation.errors)}`); + } + + return refinedStep; +}; + +/** + * Post-processes the refined step to preserve original metadata. + * @param {Object} refinedStep - The AI-generated refined step + * @param {Object} originalStep - The original step + * @returns {Object} The post-processed step + */ +const postProcessStep = (refinedStep, originalStep) => { + // Preserve stepId from original if present and not in refined + if (originalStep?.stepId && !refinedStep?.stepId) { + refinedStep.stepId = originalStep.stepId; + } + + // Preserve sourceLocation from original if present + if (originalStep?.sourceLocation && !refinedStep?.sourceLocation) { + refinedStep.sourceLocation = originalStep.sourceLocation; + } + + return refinedStep; +}; + +module.exports = { + refineStep, + buildRefinementPrompt, + truncateContent, + REFINE_STEP_SYSTEM_PROMPT, + DEFAULT_MAX_CONTEXT_LENGTH, +}; diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index f984e84..88f0c45 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -10394,6 +10394,30 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openai": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" } }, "title": "Integrations options" diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index 5140171..8765100 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -10407,6 +10407,30 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openai": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" } }, "title": "Integrations options" diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index ee42c31..da6f694 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -10792,6 +10792,30 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openai": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" } }, "title": "Integrations options" @@ -34917,6 +34941,30 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openai": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" } }, "title": "Integrations options" diff --git a/common/src/schemas/src_schemas/config_v3.schema.json b/common/src/schemas/src_schemas/config_v3.schema.json index 6eb2430..281e7ba 100644 --- a/common/src/schemas/src_schemas/config_v3.schema.json +++ b/common/src/schemas/src_schemas/config_v3.schema.json @@ -222,6 +222,30 @@ } }, "title": "Doc Detective Orchestration API" + }, + "anthropic": { + "type": "object", + "description": "Configuration for Anthropic AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Anthropic." + } + }, + "title": "Anthropic" + }, + "openai": { + "type": "object", + "description": "Configuration for OpenAI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with OpenAI." + } + }, + "title": "OpenAI" } }, "title": "Integrations options" diff --git a/common/test/ai.test.js b/common/test/ai.test.js index 6208177..1d2429e 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -8,6 +8,7 @@ const { z } = require("zod"); generate, detectProvider, detectModel, + getApiKey, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, @@ -17,6 +18,60 @@ const { z } = require("zod"); // Increase timeout for real API calls this.timeout(60000); + describe("getApiKey", function () { + it("should return undefined for null or undefined config", function () { + expect(getApiKey(null, "anthropic")).to.be.undefined; + expect(getApiKey(undefined, "anthropic")).to.be.undefined; + }); + + it("should return undefined for config without integrations", function () { + expect(getApiKey({}, "anthropic")).to.be.undefined; + expect(getApiKey({ other: "value" }, "openai")).to.be.undefined; + }); + + it("should return Anthropic API key from config.integrations.anthropic", function () { + const config = { + integrations: { + anthropic: { + apiKey: "sk-ant-test-key" + } + } + }; + expect(getApiKey(config, "anthropic")).to.equal("sk-ant-test-key"); + }); + + it("should return OpenAI API key from config.integrations.openai", function () { + const config = { + integrations: { + openai: { + apiKey: "sk-openai-test-key" + } + } + }; + expect(getApiKey(config, "openai")).to.equal("sk-openai-test-key"); + }); + + it("should return undefined for provider not in config", function () { + const config = { + integrations: { + anthropic: { + apiKey: "sk-ant-test-key" + } + } + }; + expect(getApiKey(config, "openai")).to.be.undefined; + }); + + it("should return undefined if provider integration exists but has no apiKey", function () { + const config = { + integrations: { + anthropic: {} + } + }; + expect(getApiKey(config, "anthropic")).to.be.undefined; + }); + }); + describe("modelMap", function () { it("should contain Anthropic model mappings", function () { expect(modelMap["anthropic/claude-haiku-4.5"]).to.equal("claude-haiku-4-5"); diff --git a/common/test/refineStep.test.js b/common/test/refineStep.test.js new file mode 100644 index 0000000..e57b3b9 --- /dev/null +++ b/common/test/refineStep.test.js @@ -0,0 +1,382 @@ +(async () => { + const { expect } = await import("chai"); + + // Import the refineStep module + const { + refineStep, + buildRefinementPrompt, + truncateContent, + REFINE_STEP_SYSTEM_PROMPT, + DEFAULT_MAX_CONTEXT_LENGTH, + } = require("../src/refineStep"); + + describe("RefineStep Module", function () { + // Increase timeout for real API calls + this.timeout(120000); + + describe("truncateContent", function () { + it("should return content unchanged if within limit", function () { + const content = "Short content"; + const result = truncateContent(content, 100); + expect(result).to.equal(content); + }); + + it("should truncate content exceeding limit", function () { + const content = "x".repeat(200); + const result = truncateContent(content, 100); + expect(result).to.include("[Content truncated...]"); + expect(result.length).to.be.lessThan(200); + }); + + it("should handle null or undefined content", function () { + expect(truncateContent(null, 100)).to.be.null; + expect(truncateContent(undefined, 100)).to.be.undefined; + }); + + it("should handle empty string", function () { + expect(truncateContent("", 100)).to.equal(""); + }); + }); + + describe("buildRefinementPrompt", function () { + it("should include step in prompt", function () { + const step = { find: { selector: ".test-button" } }; + const prompt = buildRefinementPrompt({ step }); + + expect(prompt).to.include("Step to Refine"); + expect(prompt).to.include(".test-button"); + }); + + it("should include failure message when provided", function () { + const step = { find: { selector: ".missing" } }; + const prompt = buildRefinementPrompt({ + step, + failureMessage: "Element not found: .missing", + }); + + expect(prompt).to.include("Failure Message"); + expect(prompt).to.include("Element not found: .missing"); + }); + + it("should include source content when provided", function () { + const step = { goTo: { url: "https://example.com" } }; + const prompt = buildRefinementPrompt({ + step, + sourceContent: "# Documentation\n\nVisit the homepage.", + }); + + expect(prompt).to.include("Source Documentation"); + expect(prompt).to.include("Visit the homepage"); + }); + + it("should include previous steps when provided", function () { + const step = { click: { selector: ".next" } }; + const previousSteps = [ + { goTo: { url: "https://example.com" } }, + { find: { selector: ".login-form" } }, + ]; + const prompt = buildRefinementPrompt({ + step, + previousSteps, + }); + + expect(prompt).to.include("Previously Executed Steps"); + expect(prompt).to.include("https://example.com"); + expect(prompt).to.include(".login-form"); + }); + + it("should include DOM context when provided", function () { + const step = { find: { selector: ".button" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + dom: "", + }, + }); + + expect(prompt).to.include("Browser DOM"); + expect(prompt).to.include("submit-btn"); + }); + + it("should include element context when provided", function () { + const step = { click: { selector: ".btn" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + element: { tagName: "button", className: "primary-btn", text: "Click me" }, + }, + }); + + expect(prompt).to.include("Target Element"); + expect(prompt).to.include("primary-btn"); + }); + + it("should include CLI output context when provided", function () { + const step = { runShell: { command: "npm test" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + cliOutput: "Error: Test failed with exit code 1", + }, + }); + + expect(prompt).to.include("CLI Output"); + expect(prompt).to.include("exit code 1"); + }); + + it("should include HTTP response context when provided", function () { + const step = { httpRequest: { url: "https://api.example.com/users" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + httpResponse: { status: 404, body: { error: "Not found" } }, + }, + }); + + expect(prompt).to.include("HTTP Response"); + expect(prompt).to.include("404"); + expect(prompt).to.include("Not found"); + }); + + it("should include accessibility tree context when provided", function () { + const step = { find: { selector: "[role='button']" } }; + const prompt = buildRefinementPrompt({ + step, + context: { + accessibility: "button 'Submit Form' focused", + }, + }); + + expect(prompt).to.include("Accessibility Tree"); + expect(prompt).to.include("Submit Form"); + }); + + it("should truncate large context sections", function () { + const step = { find: { selector: ".test" } }; + const largeDom = "
" + "x".repeat(100000) + "
"; + const prompt = buildRefinementPrompt({ + step, + context: { dom: largeDom }, + maxContextLength: 1000, + }); + + expect(prompt).to.include("[Content truncated...]"); + expect(prompt.length).to.be.lessThan(largeDom.length); + }); + }); + + describe("REFINE_STEP_SYSTEM_PROMPT", function () { + it("should contain step refinement context", function () { + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("step refinement expert"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("failure messages"); + }); + + it("should list available action types", function () { + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("goTo"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("find"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("click"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("httpRequest"); + expect(REFINE_STEP_SYSTEM_PROMPT).to.include("runShell"); + }); + }); + + describe("DEFAULT_MAX_CONTEXT_LENGTH", function () { + it("should be 50000", function () { + expect(DEFAULT_MAX_CONTEXT_LENGTH).to.equal(50000); + }); + }); + + describe("refineStep", function () { + describe("input validation", function () { + it("should throw error when step is not provided", async function () { + try { + await refineStep({}); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'step' is required and must be an object."); + } + }); + + it("should throw error when step is not an object", async function () { + try { + await refineStep({ step: "not an object" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'step' is required and must be an object."); + } + }); + + it("should throw error when step is null", async function () { + try { + await refineStep({ step: null }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'step' is required and must be an object."); + } + }); + }); + + describe("step refinement", function () { + it("should refine a step with failure context", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const originalStep = { + stepId: "step-123", + find: { selector: ".old-button-class" }, + }; + + const refinedStep = await refineStep({ + step: originalStep, + failureMessage: "Element not found: .old-button-class", + context: { + dom: ` + + `, + }, + }); + + expect(refinedStep).to.be.an("object"); + expect(refinedStep.stepId).to.equal("step-123"); // Preserved + // Should have a find action with updated selector + expect(refinedStep.find || refinedStep.click).to.exist; + }); + + it("should preserve stepId from original step", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const originalStep = { + stepId: "preserved-step-id", + goTo: { url: "https://example.com" }, + }; + + const refinedStep = await refineStep({ + step: originalStep, + sourceContent: "Navigate to the example website.", + }); + + expect(refinedStep.stepId).to.equal("preserved-step-id"); + }); + + it("should preserve sourceLocation from original step", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const originalStep = { + stepId: "step-456", + sourceLocation: { + file: "/docs/test.md", + startLine: 10, + endLine: 12, + startColumn: 1, + endColumn: 50, + startOffset: 100, + endOffset: 150, + originalText: "", + isInline: true, + isAutoDetected: false, + }, + goTo: { url: "https://example.com" }, + }; + + const refinedStep = await refineStep({ + step: originalStep, + }); + + expect(refinedStep.sourceLocation).to.deep.equal(originalStep.sourceLocation); + }); + + it("should use model from config when provided", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const refinedStep = await refineStep({ + step: { checkLink: { url: "https://example.com" } }, + config: { + ai: { + model: "anthropic/claude-haiku-4.5", + }, + }, + }); + + expect(refinedStep).to.be.an("object"); + }); + + it("should override config model with explicit model parameter", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const refinedStep = await refineStep({ + step: { wait: { duration: 1000 } }, + config: { + ai: { + model: "anthropic/claude-opus-4.5", + }, + }, + model: "anthropic/claude-haiku-4.5", + }); + + expect(refinedStep).to.be.an("object"); + }); + + it("should handle previous steps context", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const previousSteps = [ + { goTo: { url: "https://example.com" } }, + { find: { selector: ".login-form" } }, + ]; + + const refinedStep = await refineStep({ + step: { click: { selector: ".submit" } }, + previousSteps, + failureMessage: "Cannot click element: page not fully loaded", + context: { + dom: "", + }, + }); + + expect(refinedStep).to.be.an("object"); + // Should suggest a more specific selector or add a wait + expect(refinedStep.click || refinedStep.find || refinedStep.wait).to.exist; + }); + }); + + describe("step validation", function () { + it("should produce steps that pass schema validation", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const { validate } = require("../src/validate"); + + const refinedStep = await refineStep({ + step: { find: { selector: ".test" } }, + failureMessage: "Element .test not found", + context: { + dom: "
Content
", + }, + }); + + const validation = validate({schemaKey: "step_v3", object: refinedStep}); + expect(validation.valid).to.be.true; + }); + }); + }); + }); +})(); From 15b6cc58ebcdb4062039dea0f1bfe950fb5a165f Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Wed, 10 Dec 2025 11:00:58 -0800 Subject: [PATCH 63/90] Overhaul refineStep() and schema --- common/dev/dev.js | 22 +- common/dist/schemas/config_v3.schema.json | 2 +- .../dist/schemas/resolvedTests_v3.schema.json | 2 +- common/src/ai.js | 209 +++++++++-------- .../output_schemas/config_v3.schema.json | 2 +- .../resolvedTests_v3.schema.json | 2 +- common/src/schemas/schemas.json | 4 +- .../schemas/src_schemas/config_v3.schema.json | 2 +- common/test/ai.test.js | 214 ++++++++++-------- 9 files changed, 252 insertions(+), 207 deletions(-) diff --git a/common/dev/dev.js b/common/dev/dev.js index cebaacf..0ff7d6c 100644 --- a/common/dev/dev.js +++ b/common/dev/dev.js @@ -1,21 +1,13 @@ const { validate, schemas, refineStep } = require("../src/index"); +const { detectProvider } = require("../src/ai"); (async () => { -const originalStep = { - stepId: "step-123", - find: { selector: ".old-button-class" }, -}; - -const refinedStep = await refineStep({ - step: originalStep, - failureMessage: "Element not found: .old-button-class", - context: { - dom: ` - - `, - }, -}); -console.log(refinedStep); +const providerInfo = detectProvider({ + integrations: { + openAi: { apiKey: "sk-..." }, + } +}, "openai/gpt-5.1"); +console.log("Detected provider and model:", providerInfo); })(); diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index 88f0c45..1e244a3 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -10407,7 +10407,7 @@ }, "title": "Anthropic" }, - "openai": { + "openAi": { "type": "object", "description": "Configuration for OpenAI integration.", "additionalProperties": false, diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index 8765100..bc4fec1 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -10420,7 +10420,7 @@ }, "title": "Anthropic" }, - "openai": { + "openAi": { "type": "object", "description": "Configuration for OpenAI integration.", "additionalProperties": false, diff --git a/common/src/ai.js b/common/src/ai.js index b38967c..927094a 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -22,37 +22,44 @@ const modelMap = { "openai/gpt-5-nano": "gpt-5-nano", }; -/** - * Detects the platform-specific model identifier from a model string. - * @param {string} model - The model identifier. - * @returns {string | null} The platform-specific model identifier or null if not found. - */ -const detectModel = (model) => { - if (!model) return null; - return modelMap[model] || null; +const getDefaultProvider = (config) => { + // Try to detect from environment variables if no model is provided + if (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) { + return { + provider: "anthropic", + model: "claude-haiku-4-5", + apiKey: process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey, + }; + } else if (process.env.OPENAI_API_KEY || config.integrations?.openAi) { + return { + provider: "openai", + model: "gpt-5-mini", + apiKey: process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey, + }; + } else { + return { provider: null, model: null, apiKey: null }; + } }; /** - * Detects the provider and model from a model string. + * Detects the provider, model, and API from a model string and environment variables. * @param {string} model - The model identifier. - * @returns {{ provider: "openai" | "anthropic" | null, model: string | null }} The detected provider and model. + * @returns {{ provider: "openai" | "anthropic" | null, model: string | null, apiKey: string | null }} The detected provider, model, and API key. */ -const detectProvider = (model) => { - if (!model) return { provider: null, model: null }; - - const openaiPatterns = [/^openai\//]; - const anthropicPatterns = [/^anthropic\//]; - - const detectedModel = detectModel(model); - - if (openaiPatterns.some((pattern) => pattern.test(model))) { - return { provider: "openai", model: detectedModel }; +const detectProvider = (config, model) => { + const detectedModel = modelMap[model] || null; + if (!detectedModel) return getDefaultProvider(config); + + if (model.startsWith("anthropic/") && (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic)) { + const apiKey = process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey; + return { provider: "anthropic", model: detectedModel, apiKey }; } - - if (anthropicPatterns.some((pattern) => pattern.test(model))) { - return { provider: "anthropic", model: detectedModel }; + + if (model.startsWith("openai/") && (process.env.OPENAI_API_KEY || config.integrations?.openAi)) { + const apiKey = process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey; + return { provider: "openai", model: detectedModel, apiKey }; } - + return { provider: null, model: null }; }; @@ -71,14 +78,14 @@ const createProvider = ({ provider, apiKey, baseURL }) => { if (baseURL) options.baseURL = baseURL; return createOpenAI(options); } - + if (provider === "anthropic") { const options = {}; if (apiKey) options.apiKey = apiKey; if (baseURL) options.baseURL = baseURL; return createAnthropic(options); } - + throw new Error(`Unsupported provider: ${provider}`); }; @@ -92,19 +99,22 @@ const createProvider = ({ provider, apiKey, baseURL }) => { */ const fileToImagePart = (file) => { if (file.type !== "image") { - throw new Error(`Unsupported file type: ${file.type}. Only "image" is supported.`); + throw new Error( + `Unsupported file type: ${file.type}. Only "image" is supported.` + ); } - + // Check if data is a URL - const isUrl = file.data.startsWith("http://") || file.data.startsWith("https://"); - + const isUrl = + file.data.startsWith("http://") || file.data.startsWith("https://"); + if (isUrl) { return { type: "image", image: new URL(file.data), }; } - + // Base64 data return { type: "image", @@ -124,17 +134,17 @@ const buildMessageContent = ({ prompt, files }) => { if (!files || files.length === 0) { return prompt; } - + const parts = []; - + // Add text part parts.push({ type: "text", text: prompt }); - + // Add file parts for (const file of files) { parts.push(fileToImagePart(file)); } - + return parts; }; @@ -155,15 +165,15 @@ const isZodSchema = (schema) => { */ const validateAgainstZodSchema = (object, schema) => { const result = schema.safeParse(object); - + if (result.success) { return { valid: true, errors: null, object: result.data }; } - + const errors = result.error.issues .map((issue) => `${issue.path.join(".")}: ${issue.message}`) .join(", "); - + return { valid: false, errors, object }; }; @@ -174,20 +184,25 @@ const validateAgainstZodSchema = (object, schema) => { * @returns {{ valid: boolean, errors: string | null, object: Object }} Validation result. */ const validateAgainstJsonSchema = (object, schema) => { - const ajv = new Ajv({ allErrors: true, useDefaults: true, coerceTypes: true, strict: false }); + const ajv = new Ajv({ + allErrors: true, + useDefaults: true, + coerceTypes: true, + strict: false, + }); addFormats(ajv); - + const validate = ajv.compile(schema); const valid = validate(object); - + if (valid) { return { valid: true, errors: null, object }; } - + const errors = validate.errors .map((error) => `${error.instancePath || "/"} ${error.message}`) .join(", "); - + return { valid: false, errors, object }; }; @@ -225,15 +240,23 @@ const toAiSdkSchema = (schema) => { */ const getApiKey = (config, provider) => { if (!config || !config.integrations) return undefined; - - if (provider === "anthropic" && (process.env.ANTHROPIC_API_KEY || config.integrations.anthropic)) { - return process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey; + + if ( + provider === "anthropic" && + (process.env.ANTHROPIC_API_KEY || config.integrations.anthropic) + ) { + return ( + process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey + ); } - - if (provider === "openai" && (process.env.OPENAI_API_KEY || config.integrations.openai)) { + + if ( + provider === "openai" && + (process.env.OPENAI_API_KEY || config.integrations.openai) + ) { return process.env.OPENAI_API_KEY || config.integrations.openai.apiKey; } - + return undefined; }; @@ -270,13 +293,13 @@ const generate = async ({ prompt, messages, files, - model = DEFAULT_MODEL, + model, system, schema, schemaName, schemaDescription, provider, - config, + config = {}, apiKey, baseURL, temperature, @@ -286,56 +309,51 @@ const generate = async ({ if (!prompt && (!messages || messages.length === 0)) { throw new Error("Either 'prompt' or 'messages' is required."); } - + // Determine provider, model, and API key - const detected = detectProvider(model); - const resolvedProvider = provider || detected.provider; - const resolvedModel = detected.model || model; - - if (!resolvedProvider) { + const detected = detectProvider(config, model); + + if (!detected.provider) { throw new Error( `Cannot determine provider for model "${model}". Please specify a 'provider' option ("openai" or "anthropic").` ); } - - // Resolve API key: explicit apiKey > config > env vars (handled by SDK) - const resolvedApiKey = apiKey || getApiKey(config, resolvedProvider); - + // Create provider instance const providerFactory = createProvider({ - provider: resolvedProvider, - apiKey: resolvedApiKey, + provider: detected.provider, + apiKey: detected.apiKey, baseURL, }); - + // Get model instance - const modelInstance = providerFactory(resolvedModel); - + const modelInstance = providerFactory(detected.model); + // Build generation options const generationOptions = { model: modelInstance, }; - + // Add system message if provided if (system) { generationOptions.system = system; } - + // Add temperature if provided if (temperature !== undefined) { generationOptions.temperature = temperature; } - + // Add maxTokens if provided if (maxTokens !== undefined) { generationOptions.maxTokens = maxTokens; } - + // Build messages or prompt if (messages && messages.length > 0) { // Find the index of the last user message const lastUserIndex = messages.findLastIndex((msg) => msg.role === "user"); - + // Use messages array, attaching files only to the last user message generationOptions.messages = messages.map((msg, index) => { if (index === lastUserIndex && files && files.length > 0) { @@ -358,7 +376,7 @@ const generate = async ({ // Use simple prompt for text-only requests generationOptions.prompt = prompt; } - + // Handle structured output with schema if (schema) { return generateWithSchemaValidation({ @@ -370,7 +388,7 @@ const generate = async ({ messages, }); } - + // Generate text const result = await generateText(generationOptions); @@ -416,28 +434,28 @@ const generateWithSchemaValidation = async ({ }; wrappedSchema = true; } - + // Convert schema to AI SDK format (wraps JSON schemas with jsonSchema()) const aiSdkSchema = toAiSdkSchema(schema); - + for (let attempt = 1; attempt <= MAX_SCHEMA_VALIDATION_RETRIES; attempt++) { const objectOptions = { ...generationOptions, schema: aiSdkSchema, }; - + if (schemaName) { objectOptions.schemaName = schemaName; } - + if (schemaDescription) { objectOptions.schemaDescription = schemaDescription; } - + // Add retry context if this is a retry attempt if (attempt > 1 && lastError) { const retryMessage = `Previous attempt failed schema validation with errors: ${lastError}. Please fix these issues and try again.`; - + if (objectOptions.messages) { // Add retry context to messages objectOptions.messages = [ @@ -450,16 +468,23 @@ const generateWithSchemaValidation = async ({ objectOptions.prompt = `${objectOptions.prompt}\n\n${retryMessage}`; } } - + try { const result = await generateObject(objectOptions); - - const validationObject = wrappedSchema ? result.object.object : result.object; - const validationSchema = wrappedSchema ? schema.properties.object : schema; + + const validationObject = wrappedSchema + ? result.object.object + : result.object; + const validationSchema = wrappedSchema + ? schema.properties.object + : schema; // Validate the generated object against the schema ourselves - const validation = validateAgainstSchema(validationObject, validationSchema); - + const validation = validateAgainstSchema( + validationObject, + validationSchema + ); + if (validation.valid) { return { object: validationObject, @@ -467,11 +492,11 @@ const generateWithSchemaValidation = async ({ finishReason: result.finishReason, }; } - + // Schema validation failed, store error for retry lastError = validation.errors; lastObject = result.object; - + if (attempt === MAX_SCHEMA_VALIDATION_RETRIES) { throw new Error( `Schema validation failed after ${MAX_SCHEMA_VALIDATION_RETRIES} attempts. Last errors: ${validation.errors}` @@ -479,16 +504,19 @@ const generateWithSchemaValidation = async ({ } } catch (error) { // If it's our validation error and we have retries left, continue - if (error.message.includes("Schema validation failed after") || attempt === MAX_SCHEMA_VALIDATION_RETRIES) { + if ( + error.message.includes("Schema validation failed after") || + attempt === MAX_SCHEMA_VALIDATION_RETRIES + ) { throw error; } - + // Store the error and retry lastError = error.message; lastObject = null; } } - + throw new Error( `Schema validation failed after ${MAX_SCHEMA_VALIDATION_RETRIES} attempts. Last errors: ${lastError}` ); @@ -497,7 +525,6 @@ const generateWithSchemaValidation = async ({ module.exports = { generate, detectProvider, - detectModel, getApiKey, modelMap, DEFAULT_MODEL, diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index 88f0c45..1e244a3 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -10407,7 +10407,7 @@ }, "title": "Anthropic" }, - "openai": { + "openAi": { "type": "object", "description": "Configuration for OpenAI integration.", "additionalProperties": false, diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index 8765100..bc4fec1 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -10420,7 +10420,7 @@ }, "title": "Anthropic" }, - "openai": { + "openAi": { "type": "object", "description": "Configuration for OpenAI integration.", "additionalProperties": false, diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index da6f694..2e2a247 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -10805,7 +10805,7 @@ }, "title": "Anthropic" }, - "openai": { + "openAi": { "type": "object", "description": "Configuration for OpenAI integration.", "additionalProperties": false, @@ -34954,7 +34954,7 @@ }, "title": "Anthropic" }, - "openai": { + "openAi": { "type": "object", "description": "Configuration for OpenAI integration.", "additionalProperties": false, diff --git a/common/src/schemas/src_schemas/config_v3.schema.json b/common/src/schemas/src_schemas/config_v3.schema.json index 281e7ba..00b836d 100644 --- a/common/src/schemas/src_schemas/config_v3.schema.json +++ b/common/src/schemas/src_schemas/config_v3.schema.json @@ -235,7 +235,7 @@ }, "title": "Anthropic" }, - "openai": { + "openAi": { "type": "object", "description": "Configuration for OpenAI integration.", "additionalProperties": false, diff --git a/common/test/ai.test.js b/common/test/ai.test.js index 1d2429e..a76e1ce 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -7,7 +7,6 @@ const { z } = require("zod"); const { generate, detectProvider, - detectModel, getApiKey, modelMap, DEFAULT_MODEL, @@ -18,122 +17,135 @@ const { z } = require("zod"); // Increase timeout for real API calls this.timeout(60000); - describe("getApiKey", function () { - it("should return undefined for null or undefined config", function () { - expect(getApiKey(null, "anthropic")).to.be.undefined; - expect(getApiKey(undefined, "anthropic")).to.be.undefined; - }); - - it("should return undefined for config without integrations", function () { - expect(getApiKey({}, "anthropic")).to.be.undefined; - expect(getApiKey({ other: "value" }, "openai")).to.be.undefined; - }); - - it("should return Anthropic API key from config.integrations.anthropic", function () { - const config = { - integrations: { - anthropic: { - apiKey: "sk-ant-test-key" - } - } - }; - expect(getApiKey(config, "anthropic")).to.equal("sk-ant-test-key"); - }); - - it("should return OpenAI API key from config.integrations.openai", function () { - const config = { - integrations: { - openai: { - apiKey: "sk-openai-test-key" - } - } - }; - expect(getApiKey(config, "openai")).to.equal("sk-openai-test-key"); - }); - - it("should return undefined for provider not in config", function () { - const config = { - integrations: { - anthropic: { - apiKey: "sk-ant-test-key" - } - } - }; - expect(getApiKey(config, "openai")).to.be.undefined; - }); - - it("should return undefined if provider integration exists but has no apiKey", function () { - const config = { - integrations: { - anthropic: {} - } - }; - expect(getApiKey(config, "anthropic")).to.be.undefined; - }); - }); - describe("modelMap", function () { it("should contain Anthropic model mappings", function () { expect(modelMap["anthropic/claude-haiku-4.5"]).to.equal("claude-haiku-4-5"); expect(modelMap["anthropic/claude-sonnet-4.5"]).to.equal("claude-sonnet-4-5"); expect(modelMap["anthropic/claude-opus-4.5"]).to.equal("claude-opus-4-5"); }); + + it("should contain OpenAI model mappings", function () { + expect(modelMap["openai/gpt-5.1"]).to.equal("gpt-5.1"); + expect(modelMap["openai/gpt-5-mini"]).to.equal("gpt-5-mini"); + expect(modelMap["openai/gpt-5-nano"]).to.equal("gpt-5-nano"); + }); }); - describe("detectModel", function () { - it("should return mapped model for known models", function () { - expect(detectModel("anthropic/claude-haiku-4.5")).to.equal("claude-haiku-4-5"); - expect(detectModel("anthropic/claude-sonnet-4.5")).to.equal("claude-sonnet-4-5"); - expect(detectModel("anthropic/claude-opus-4.5")).to.equal("claude-opus-4-5"); + describe("detectProvider", function () { + // Store original env vars to restore after tests + let originalAnthropicKey; + let originalOpenAIKey; + + beforeEach(function () { + originalAnthropicKey = process.env.ANTHROPIC_API_KEY; + originalOpenAIKey = process.env.OPENAI_API_KEY; + // Clear env vars for predictable testing + delete process.env.ANTHROPIC_API_KEY; + delete process.env.OPENAI_API_KEY; }); - it("should return null for unknown models", function () { - expect(detectModel("unknown-model")).to.be.null; - expect(detectModel("openai/gpt-4")).to.be.null; + afterEach(function () { + // Restore original env vars + if (originalAnthropicKey !== undefined) { + process.env.ANTHROPIC_API_KEY = originalAnthropicKey; + } else { + delete process.env.ANTHROPIC_API_KEY; + } + if (originalOpenAIKey !== undefined) { + process.env.OPENAI_API_KEY = originalOpenAIKey; + } else { + delete process.env.OPENAI_API_KEY; + } }); - it("should return null for empty or null input", function () { - expect(detectModel("")).to.be.null; - expect(detectModel(null)).to.be.null; - expect(detectModel(undefined)).to.be.null; + it("should detect Anthropic provider and mapped model for known Anthropic models with config API key", function () { + const config = { integrations: { anthropic: { apiKey: "sk-ant-test" } } }; + expect(detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + provider: "anthropic", + model: "claude-haiku-4-5", + apiKey: "sk-ant-test", + }); + expect(detectProvider(config, "anthropic/claude-sonnet-4.5")).to.deep.equal({ + provider: "anthropic", + model: "claude-sonnet-4-5", + apiKey: "sk-ant-test", + }); + expect(detectProvider(config, "anthropic/claude-opus-4.5")).to.deep.equal({ + provider: "anthropic", + model: "claude-opus-4-5", + apiKey: "sk-ant-test", + }); }); - }); - describe("detectProvider", function () { - it("should detect OpenAI for gpt- models", function () { - expect(detectProvider("openai/gpt-4")).to.deep.equal({ provider: "openai", model: null }); - expect(detectProvider("openai/gpt-3.5-turbo")).to.deep.equal({ provider: "openai", model: null }); - expect(detectProvider("openai/gpt-4o")).to.deep.equal({ provider: "openai", model: null }); + it("should detect Anthropic provider with env API key", function () { + process.env.ANTHROPIC_API_KEY = "sk-ant-env"; + const config = {}; + expect(detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + provider: "anthropic", + model: "claude-haiku-4-5", + apiKey: "sk-ant-env", + }); }); - it("should detect OpenAI for o1/o3 models", function () { - expect(detectProvider("openai/o1-preview")).to.deep.equal({ provider: "openai", model: null }); - expect(detectProvider("openai/o1-mini")).to.deep.equal({ provider: "openai", model: null }); - expect(detectProvider("openai/o3-mini")).to.deep.equal({ provider: "openai", model: null }); + it("should detect OpenAI provider and mapped model for known OpenAI models with config API key", function () { + const config = { integrations: { openAi: { apiKey: "sk-openai-test" } } }; + expect(detectProvider(config, "openai/gpt-5.1")).to.deep.equal({ + provider: "openai", + model: "gpt-5.1", + apiKey: "sk-openai-test", + }); + expect(detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ + provider: "openai", + model: "gpt-5-mini", + apiKey: "sk-openai-test", + }); + expect(detectProvider(config, "openai/gpt-5-nano")).to.deep.equal({ + provider: "openai", + model: "gpt-5-nano", + apiKey: "sk-openai-test", + }); }); - it("should detect Anthropic for claude- models", function () { - expect(detectProvider("anthropic/claude-3-5-haiku-latest")).to.deep.equal({ provider: "anthropic", model: null }); - expect(detectProvider("anthropic/claude-3-opus-20240229")).to.deep.equal({ provider: "anthropic", model: null }); - expect(detectProvider("anthropic/claude-3-sonnet-20240229")).to.deep.equal({ provider: "anthropic", model: null }); + it("should detect OpenAI provider with env API key", function () { + process.env.OPENAI_API_KEY = "sk-openai-env"; + const config = {}; + expect(detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ + provider: "openai", + model: "gpt-5-mini", + apiKey: "sk-openai-env", + }); }); - it("should detect Anthropic and return mapped model for known models", function () { - expect(detectProvider("anthropic/claude-haiku-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-haiku-4-5" }); - expect(detectProvider("anthropic/claude-sonnet-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-sonnet-4-5" }); - expect(detectProvider("anthropic/claude-opus-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-opus-4-5" }); + it("should prefer env API key over config API key", function () { + process.env.ANTHROPIC_API_KEY = "sk-ant-env"; + const config = { integrations: { anthropic: { apiKey: "sk-ant-config" } } }; + expect(detectProvider(config, "anthropic/claude-haiku-4.5").apiKey).to.equal("sk-ant-env"); }); - it("should return null provider and model for unknown models", function () { - expect(detectProvider("unknown-model")).to.deep.equal({ provider: null, model: null }); - expect(detectProvider("gemini-pro")).to.deep.equal({ provider: null, model: null }); - expect(detectProvider("llama-2")).to.deep.equal({ provider: null, model: null }); + it("should fall back to default provider when model is not in modelMap", function () { + process.env.ANTHROPIC_API_KEY = "sk-ant-env"; + const config = {}; + const result = detectProvider(config, "unknown-model"); + expect(result.provider).to.equal("anthropic"); + expect(result.model).to.equal("claude-haiku-4-5"); + expect(result.apiKey).to.equal("sk-ant-env"); }); - it("should return null provider and model for empty or null input", function () { - expect(detectProvider("")).to.deep.equal({ provider: null, model: null }); - expect(detectProvider(null)).to.deep.equal({ provider: null, model: null }); - expect(detectProvider(undefined)).to.deep.equal({ provider: null, model: null }); + it("should return null values when no API key is available and model is unknown", function () { + const config = {}; + expect(detectProvider(config, "unknown-model")).to.deep.equal({ + provider: null, + model: null, + apiKey: null, + }); + }); + + it("should return null values when model is known but no API key for that provider", function () { + const config = {}; + expect(detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + provider: null, + model: null, + }); }); }); @@ -170,12 +182,26 @@ const { z } = require("zod"); }); it("should throw error when provider cannot be determined", async function () { + // Save and clear env vars to ensure no fallback provider + const originalAnthropicKey = process.env.ANTHROPIC_API_KEY; + const originalOpenAIKey = process.env.OPENAI_API_KEY; + delete process.env.ANTHROPIC_API_KEY; + delete process.env.OPENAI_API_KEY; + try { - await generate({ prompt: "Hello", model: "unknown-model" }); + await generate({ prompt: "Hello", model: "unknown-model", config: {} }); expect.fail("Should have thrown an error"); } catch (error) { expect(error.message).to.include("Cannot determine provider"); expect(error.message).to.include("unknown-model"); + } finally { + // Restore env vars + if (originalAnthropicKey !== undefined) { + process.env.ANTHROPIC_API_KEY = originalAnthropicKey; + } + if (originalOpenAIKey !== undefined) { + process.env.OPENAI_API_KEY = originalOpenAIKey; + } } }); }); From fbcf08b55d2fc19de36f8679b4c571ea1db24bc9 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Wed, 10 Dec 2025 13:59:04 -0800 Subject: [PATCH 64/90] Add analyze module and integrate into resolver; enhance main functionality --- resolver/dev/index.js | 17 ++- resolver/src/analyze.js | 143 ++++++++++++++++++++ resolver/src/analyze.test.js | 254 +++++++++++++++++++++++++++++++++++ resolver/src/index.js | 2 + 4 files changed, 414 insertions(+), 2 deletions(-) create mode 100644 resolver/src/analyze.js create mode 100644 resolver/src/analyze.test.js diff --git a/resolver/dev/index.js b/resolver/dev/index.js index 904d685..f777756 100644 --- a/resolver/dev/index.js +++ b/resolver/dev/index.js @@ -1,6 +1,7 @@ const { detectTests, resolveTests, detectAndResolveTests } = require("../src"); const { validate, schemas } = require("doc-detective-common"); const { execCommand, spawnCommand } = require("../src/utils"); +const { analyze } = require("../src/analyze"); const path = require("path"); main(); @@ -19,9 +20,21 @@ async function main() { platforms: ["linux", "mac", "windows"], browsers: ["chrome", "firefox"], }, - ] + ], + integrations: { + anthropic: { + apiKey: process.env.ANTHROPIC_API_KEY, + } + } }; - result = await detectTests({ config: json }); + const content = `To search for American Shorthair kittens, + +1. Go to [DuckDuckGo](https://www.duckduckgo.com). +2. In the search bar, enter "American Shorthair kittens", then press Enter. + +!["Search results for kittens"](search-results.png){ .screenshot }`; + + const result = await analyze({ content, config: json }); console.log(JSON.stringify(result, null, 2)); // Output the result to a file const outputPath = path.join(__dirname, "output.json"); diff --git a/resolver/src/analyze.js b/resolver/src/analyze.js new file mode 100644 index 0000000..a590c30 --- /dev/null +++ b/resolver/src/analyze.js @@ -0,0 +1,143 @@ +const { generate, schemas, validate } = require("doc-detective-common"); +const crypto = require("crypto"); + +const DEFAULT_MAX_CONTENT_LENGTH = 100000; + +/** + * System prompt for analyzing documentation and generating test specifications. + */ +const ANALYSIS_SYSTEM_PROMPT = `You are a documentation testing expert. Your task is to analyze documentation content and generate tests that verify the documented behavior is accurate. + +When analyzing documentation: +1. Identify testable assertions - URLs, UI interactions, API calls, shell commands, code examples +2. Generate appropriate test steps for each assertion +3. Maintain the logical order of operations as described in the documentation +4. Use appropriate action types: goTo, find, click, type, checkLink, httpRequest, runShell, runCode, screenshot, wait +5. For UI interactions, prefer element* properties when specific elements are mentioned, using the following priority: elementText, elementAria, elementClass, elementAttributes, selector +6. For links, use checkLink to verify they return acceptable status codes +7. Generate descriptive test and step IDs based on the content + +Output a valid Doc Detective test containing steps that verify the documentation.`; + +/** + * Builds the analysis prompt from the provided content and context. + * @param {Object} options + * @param {string} options.content - The documentation content to analyze + * @param {string} [options.filePath] - Path to the source file for context + * @param {number} [options.maxContentLength] - Maximum content length before truncation + * @returns {string} The formatted prompt + */ +const buildAnalysisPrompt = ({ + content, + filePath, + maxContentLength = DEFAULT_MAX_CONTENT_LENGTH, +}) => { + // Truncate content if it exceeds the maximum length + const truncatedContent = + content.length > maxContentLength + ? content.substring(0, maxContentLength) + + "\n\n[Content truncated due to length...]" + : content; + + let prompt = + "Analyze the following documentation and generate a test specification:\n\n"; + + if (filePath) { + prompt += `Source file: ${filePath}\n\n`; + } + + prompt += `--- Documentation Content ---\n${truncatedContent}\n--- End Content ---\n\n`; + prompt += + "Generate a Doc Detective specification with tests that verify the documented behavior. Include appropriate steps for each testable assertion found in the documentation."; + + return prompt; +}; + +/** + * Generates a unique ID for specs and tests. + * @param {string} [prefix] - Optional prefix for the ID + * @returns {string} A unique ID + */ +const generateId = (prefix = "") => { + const uuid = crypto.randomUUID(); + return prefix ? `${prefix}-${uuid}` : uuid; +}; + +/** + * Analyzes document content using AI to generate test specifications. + * + * @param {Object} options - Analysis options + * @param {string} options.content - Raw document content to analyze (required) + * @param {string} [options.filePath] - Path to the source file for context + * @param {Object} [options.config] - Doc Detective configuration object + * @param {string} [options.model] - LLM model override (takes precedence over defaults) + * @param {number} [options.maxContentLength] - Maximum content length before truncation (default: 100000) + * @param {Array} [options.files] - Optional images/screenshots to include for multimodal analysis + * @returns {Promise} A promise that resolves to a spec_v3 compatible specification + * @throws {Error} If content is not provided or generation fails + * + * @example + * const spec = await analyze({ + * content: "# Getting Started\n\nNavigate to https://example.com...", + * filePath: "docs/getting-started.md", + * config: { integrations: { anthropic: { apiKey: "sk-..." } } } + * }); + */ +const analyze = async ({ + content, + filePath, + config = {}, + model, + maxContentLength = DEFAULT_MAX_CONTENT_LENGTH, + files, +}) => { + // Validate required input + if (!content || typeof content !== "string") { + throw new Error("'content' is required and must be a string."); + } + + // Build the prompt + const prompt = buildAnalysisPrompt({ + content, + filePath, + maxContentLength, + }); + + // Get the test schema for structured output + const testSchema = schemas.test_v3; + + // Generate the specification using AI + // Pass config for integrations API keys, generate() will extract the right one + let result; + try { + result = await generate({ + prompt, + system: ANALYSIS_SYSTEM_PROMPT, + schema: testSchema, + schemaName: "test", + schemaDescription: "A Doc Detective test", + config, + files, + }); + } catch (error) { + throw new Error(`Failed to generate test specification: ${error.message}`); + } + + // Validate the spec against the schema + const validation = validate({ schemaKey: "test_v3", object: result.object }); + if (!validation.valid) { + throw new Error( + `Generated test failed validation: ${JSON.stringify(validation.errors)}` + ); + } + + return result.object; +}; + + +module.exports = { + analyze, + buildAnalysisPrompt, + ANALYSIS_SYSTEM_PROMPT, + DEFAULT_MAX_CONTENT_LENGTH, +}; diff --git a/resolver/src/analyze.test.js b/resolver/src/analyze.test.js new file mode 100644 index 0000000..e45f14a --- /dev/null +++ b/resolver/src/analyze.test.js @@ -0,0 +1,254 @@ +const crypto = require("crypto"); + +(async () => { + const { expect } = await import("chai"); + const sinon = await import("sinon"); + + // Import the analyze module + const { + analyze, + buildAnalysisPrompt, + ANALYSIS_SYSTEM_PROMPT, + DEFAULT_MAX_CONTENT_LENGTH, + } = require("./analyze"); + + describe("Analyze Module", function () { + // Increase timeout for real API calls + this.timeout(120000); + + describe("buildAnalysisPrompt", function () { + it("should build prompt with content only", function () { + const prompt = buildAnalysisPrompt({ + content: "# Getting Started\n\nNavigate to https://example.com", + }); + + expect(prompt).to.include("Analyze the following documentation"); + expect(prompt).to.include("# Getting Started"); + expect(prompt).to.include("https://example.com"); + expect(prompt).to.not.include("Source file:"); + }); + + it("should include file path when provided", function () { + const prompt = buildAnalysisPrompt({ + content: "Test content", + filePath: "/docs/getting-started.md", + }); + + expect(prompt).to.include("Source file: /docs/getting-started.md"); + }); + + it("should truncate content exceeding max length", function () { + const longContent = "x".repeat(200); + const prompt = buildAnalysisPrompt({ + content: longContent, + maxContentLength: 100, + }); + + expect(prompt).to.include("[Content truncated due to length...]"); + expect(prompt).to.not.include("x".repeat(200)); + }); + + it("should not truncate content within max length", function () { + const shortContent = "Short test content"; + const prompt = buildAnalysisPrompt({ + content: shortContent, + maxContentLength: 1000, + }); + + expect(prompt).to.include(shortContent); + expect(prompt).to.not.include("[Content truncated"); + }); + }); + + describe("ANALYSIS_SYSTEM_PROMPT", function () { + it("should contain documentation testing context", function () { + expect(ANALYSIS_SYSTEM_PROMPT).to.include("documentation testing expert"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("testable assertions"); + }); + + it("should mention available action types", function () { + expect(ANALYSIS_SYSTEM_PROMPT).to.include("goTo"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("find"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("checkLink"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("httpRequest"); + }); + }); + + describe("DEFAULT_MAX_CONTENT_LENGTH", function () { + it("should be 100000", function () { + expect(DEFAULT_MAX_CONTENT_LENGTH).to.equal(100000); + }); + }); + + describe("analyze", function () { + describe("input validation", function () { + it("should throw error when content is not provided", async function () { + try { + await analyze({}); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + + it("should throw error when content is not a string", async function () { + try { + await analyze({ content: 123 }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + + it("should throw error when content is empty string", async function () { + try { + await analyze({ content: "" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + }); + + describe("test generation", function () { + it("should generate a valid test from simple documentation", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const content = `# Getting Started + +Welcome to our documentation. + +## Step 1: Visit the homepage + +Navigate to https://example.com to get started. + +## Step 2: Check the API + +Make sure the API endpoint https://api.example.com/health returns a 200 status.`; + + const test = await analyze({ content }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + expect(test.steps.length).to.be.at.least(1); + }); + + it("should include file info when filePath is provided", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const test = await analyze({ + content: "Test documentation with a link: https://example.com", + filePath: "/docs/test.md", + }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + }); + + it("should use model from config when provided", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const test = await analyze({ + content: "Navigate to https://example.com and click the button.", + config: { + ai: { + model: "anthropic/claude-haiku-4.5", + }, + }, + }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + }); + + it("should override config model with explicit model parameter", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const test = await analyze({ + content: "Check that https://example.com returns 200.", + config: { + ai: { + model: "anthropic/claude-opus-4.5", // This should be overridden + }, + }, + model: "anthropic/claude-haiku-4.5", // Use cheaper model + }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + }); + + it("should generate steps with appropriate action types", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const content = `# API Testing Guide + +Make a GET request to https://api.example.com/users to get the list of users. +The response should have a 200 status code.`; + + const test = await analyze({ content }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + expect(test.steps.length).to.be.at.least(1); + + // Find a step with httpRequest or checkLink action + const hasApiStep = test.steps.some(step => + step.httpRequest || step.checkLink + ); + expect(hasApiStep).to.be.true; + }); + + it("should handle maxContentLength parameter", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const longContent = "Visit https://example.com. " + "x".repeat(50000); + + const test = await analyze({ + content: longContent, + maxContentLength: 1000, + }); + + expect(test).to.be.an("object"); + expect(test.steps).to.be.an("array"); + }); + }); + + describe("test validation", function () { + it("should produce tests that pass schema validation", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const { validate } = require("doc-detective-common"); + + const test = await analyze({ + content: "Go to https://example.com and verify the page loads.", + }); + + const validation = validate({schemaKey: "test_v3", object: test}); + expect(validation.valid).to.be.true; + }); + }); + }); + }); +})(); diff --git a/resolver/src/index.js b/resolver/src/index.js index 4586e31..ef6cf78 100644 --- a/resolver/src/index.js +++ b/resolver/src/index.js @@ -1,11 +1,13 @@ const { setConfig } = require("./config"); const { qualifyFiles, parseTests, log } = require("./utils"); const { resolveDetectedTests } = require("./resolve"); +const { analyze } = require("./analyze"); // const { telemetryNotice, sendTelemetry } = require("./telem"); exports.detectTests = detectTests; exports.resolveTests = resolveTests; exports.detectAndResolveTests = detectAndResolveTests; +exports.analyze = analyze; // const supportMessage = ` // ########################################################################## From bbc0ac596afaddd3e049d43d22d2d894d04418d5 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Wed, 10 Dec 2025 14:21:36 -0800 Subject: [PATCH 65/90] Add AI refinement capabilities to DebugRunner; implement step suggestion and error handling --- cli/src/cli/builder/DebugRunner.mjs | 232 +++++++++++++++++++++++++++- 1 file changed, 228 insertions(+), 4 deletions(-) diff --git a/cli/src/cli/builder/DebugRunner.mjs b/cli/src/cli/builder/DebugRunner.mjs index 3a234be..d1e9130 100644 --- a/cli/src/cli/builder/DebugRunner.mjs +++ b/cli/src/cli/builder/DebugRunner.mjs @@ -21,6 +21,19 @@ import { stepRequiresBrowser, } from './schemaUtils.mjs'; +// AI utilities from common +const { refineStep, detectProvider } = require('doc-detective-common'); + +/** + * Check if an AI provider is available via environment variables or config + * @param {Object} [config={}] - Optional configuration object + * @returns {boolean} True if an AI provider is available + */ +function isAiAvailable(config = {}) { + const detected = detectProvider(config, null); + return detected.provider !== null && detected.apiKey !== null; +} + /** * Truncate a string to a maximum number of grapheme clusters (user-perceived characters). * Uses Intl.Segmenter if available (Node 16+), otherwise falls back to Array.from for code-point safety. @@ -93,7 +106,7 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { const { exit } = useApp(); // Phase states - const [phase, setPhase] = useState('init'); // 'init', 'checkGoTo', 'addGoTo', 'running', 'stepPreview', 'stepEdit', 'stepResult', 'complete', 'error' + const [phase, setPhase] = useState('init'); // 'init', 'checkGoTo', 'addGoTo', 'running', 'stepPreview', 'stepEdit', 'stepResult', 'aiRefining', 'aiRefineResult', 'complete', 'error' // Runner state const [runner, setRunner] = useState(null); @@ -109,6 +122,11 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { const [stepResult, setStepResult] = useState(null); const [isExecuting, setIsExecuting] = useState(false); + // AI refinement state + const [aiAvailable] = useState(() => isAiAvailable()); + const [aiRefinedStep, setAiRefinedStep] = useState(null); + const [aiRefineError, setAiRefineError] = useState(null); + // Results tracking const [results, setResults] = useState({ passed: 0, failed: 0 }); @@ -162,6 +180,11 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { if (key.escape) { if (phase === 'stepEdit') { setPhase('stepPreview'); + } else if (phase === 'aiRefineResult') { + // Go back to stepResult without AI + setAiRefinedStep(null); + setAiRefineError(null); + setPhase('stepResult'); } else if (phase === 'stepPreview' || phase === 'stepResult') { // Clear auto-advance timer when leaving stepResult if (autoAdvanceTimer.current) { @@ -189,6 +212,44 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { callback(); }, [cleanup]); + // Attempt AI refinement of a failed step + const attemptAiRefinement = useCallback(async (step, failureMessage) => { + if (!aiAvailable) return; + + setAiRefinedStep(null); + setAiRefineError(null); + setPhase('aiRefining'); + + try { + // Get previous steps for context + const previousSteps = (localTest.steps || []).slice(0, currentStepIndex); + + // Try to get the current browser DOM for context + let dom = null; + if (runner) { + try { + dom = await runner.getPageSource(); + } catch (domError) { + // Ignore DOM fetch errors - browser might not have a page loaded + } + } + + const refined = await refineStep({ + step, + failureMessage, + previousSteps, + context: dom ? { dom } : undefined, + config: {}, // Uses env vars for API keys + }); + + setAiRefinedStep(refined); + setPhase('aiRefineResult'); + } catch (error) { + setAiRefineError(error.message || 'AI refinement failed'); + setPhase('aiRefineResult'); + } + }, [aiAvailable, localTest.steps, currentStepIndex, runner]); + // Execute current step const executeStep = useCallback(async () => { if (!runStep || !runner) return; @@ -231,7 +292,12 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { }, 1500); } else { setResults((prev) => ({ ...prev, failed: prev.failed + 1 })); - setPhase('stepResult'); + // If AI is available, attempt automatic refinement + if (aiAvailable) { + attemptAiRefinement(step, result.description || 'Step failed'); + } else { + setPhase('stepResult'); + } } } catch (error) { setStepResult({ @@ -239,11 +305,16 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { description: error.message || 'Step execution failed', }); setResults((prev) => ({ ...prev, failed: prev.failed + 1 })); - setPhase('stepResult'); + // If AI is available, attempt automatic refinement + if (aiAvailable) { + attemptAiRefinement(steps[currentStepIndex], error.message || 'Step execution failed'); + } else { + setPhase('stepResult'); + } } finally { setIsExecuting(false); } - }, [runStep, runner, localTest.steps, currentStepIndex]); + }, [runStep, runner, localTest.steps, currentStepIndex, aiAvailable, attemptAiRefinement]); // Add goTo step at the specified index const addGoToStep = useCallback((url, insertIndex) => { @@ -543,6 +614,159 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { } } + // AI refining phase - loading state + if (phase === 'aiRefining') { + const { actionType } = getStepDisplay(currentStep); + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`, 'AI Refinement'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red', bold: true }, '❌ Step Failed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `"${actionType}" failed to execute.`) + ), + stepResult?.description && React.createElement( + Box, + { marginBottom: 1, paddingX: 1, borderStyle: 'single', borderColor: 'red' }, + React.createElement(Text, { color: 'red' }, stepResult.description) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan' }, '🤖 Attempting AI-powered step refinement...') + ), + React.createElement( + Text, + { color: 'gray', dimColor: true }, + 'The AI is analyzing the failure and suggesting fixes.' + ) + ); + } + + // AI refine result phase - show AI suggestion or error + if (phase === 'aiRefineResult') { + const { actionType } = getStepDisplay(currentStep); + + if (aiRefineError) { + // AI refinement failed - fall back to manual editing + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`], + validationStatus: false, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red', bold: true }, '❌ Step Failed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, `"${actionType}" failed to execute.`) + ), + stepResult?.description && React.createElement( + Box, + { marginBottom: 1, paddingX: 1, borderStyle: 'single', borderColor: 'red' }, + React.createElement(Text, { color: 'red' }, stepResult.description) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'yellow' }, '⚠️ AI refinement failed: '), + React.createElement(Text, { color: 'gray' }, truncateGraphemeSafe(aiRefineError, 80)) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: '✏️ Edit step manually and retry', value: 'editRetry' }, + { label: '⛔ Stop debug session', value: 'stop' }, + ], + onSelect: (item) => { + if (item.value === 'editRetry') { + setResults((prev) => ({ ...prev, failed: prev.failed - 1 })); + setPhase('stepEdit'); + } else { + cleanupAndExit(() => onComplete(localTest)); + } + }, + }) + ); + } + + // AI refinement succeeded - show the suggestion + const refinedDisplay = getStepDisplay(aiRefinedStep); + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: ['Debug Runner', `Step ${currentStepIndex + 1}/${totalSteps}`, 'AI Suggestion'], + validationStatus: null, + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'cyan', bold: true }, '🤖 AI Suggested Fix') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, null, 'The AI has suggested a refined version of this step:') + ), + React.createElement( + Box, + { marginBottom: 1, borderStyle: 'single', borderColor: 'cyan', paddingX: 1 }, + React.createElement( + Box, + { flexDirection: 'column' }, + React.createElement(Text, { color: 'gray', dimColor: true }, 'Suggested Step:'), + React.createElement(Text, { color: 'white' }, JSON.stringify(aiRefinedStep, null, 2)) + ) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, `Progress: ${results.passed} passed, ${results.failed} failed`) + ), + React.createElement(SelectInput, { + items: [ + { label: '✅ Accept AI suggestion', value: 'accept' }, + { label: '↩️ Keep original step and edit manually', value: 'editOriginal' }, + { label: '⛔ Stop debug session', value: 'stop' }, + ], + onSelect: (item) => { + if (item.value === 'accept') { + // Apply the AI suggestion and retry + updateStep(currentStepIndex, aiRefinedStep); + setResults((prev) => ({ ...prev, failed: prev.failed - 1 })); + setAiRefinedStep(null); + setPhase('stepPreview'); + } else if (item.value === 'editOriginal') { + // Discard AI suggestion, edit original + setResults((prev) => ({ ...prev, failed: prev.failed - 1 })); + setAiRefinedStep(null); + setPhase('stepEdit'); + } else { + cleanupAndExit(() => onComplete(localTest)); + } + }, + }) + ); + } + // Confirm exit phase if (phase === 'confirmExit') { return React.createElement( From 4b1c24647b052e4906ba1a24f987fcff5f715b4e Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Wed, 10 Dec 2025 14:55:57 -0800 Subject: [PATCH 66/90] Enhance analyze module to support partial tests; add functionality for merging fields and expanding steps --- resolver/src/analyze.js | 81 ++++++- resolver/src/analyze.test.js | 411 +++++++++++++++++++++++++++++++++-- 2 files changed, 475 insertions(+), 17 deletions(-) diff --git a/resolver/src/analyze.js b/resolver/src/analyze.js index a590c30..a6bbe05 100644 --- a/resolver/src/analyze.js +++ b/resolver/src/analyze.js @@ -17,6 +17,13 @@ When analyzing documentation: 6. For links, use checkLink to verify they return acceptable status codes 7. Generate descriptive test and step IDs based on the content +When a partial test is provided: +1. Use it as a starting point for your generated test +2. Fill in any missing required fields (especially steps if empty or incomplete) +3. Expand incomplete steps with appropriate action details based on the documentation +4. Preserve any existing field values from the partial test unless they conflict with the documentation +5. Let the documentation guide what steps should be generated, but respect the partial test's structure + Output a valid Doc Detective test containing steps that verify the documentation.`; /** @@ -25,12 +32,14 @@ Output a valid Doc Detective test containing steps that verify the documentation * @param {string} options.content - The documentation content to analyze * @param {string} [options.filePath] - Path to the source file for context * @param {number} [options.maxContentLength] - Maximum content length before truncation + * @param {Object} [options.test] - Optional partial test to use as starting point * @returns {string} The formatted prompt */ const buildAnalysisPrompt = ({ content, filePath, maxContentLength = DEFAULT_MAX_CONTENT_LENGTH, + test, }) => { // Truncate content if it exceeds the maximum length const truncatedContent = @@ -47,8 +56,15 @@ const buildAnalysisPrompt = ({ } prompt += `--- Documentation Content ---\n${truncatedContent}\n--- End Content ---\n\n`; - prompt += - "Generate a Doc Detective specification with tests that verify the documented behavior. Include appropriate steps for each testable assertion found in the documentation."; + + if (test) { + prompt += `--- Partial Test (use as starting point) ---\n${JSON.stringify(test, null, 2)}\n--- End Partial Test ---\n\n`; + prompt += + "Complete and expand the partial test above based on the documentation. Fill in missing fields, expand incomplete steps, and add any additional steps needed to verify the documented behavior."; + } else { + prompt += + "Generate a Doc Detective specification with tests that verify the documented behavior. Include appropriate steps for each testable assertion found in the documentation."; + } return prompt; }; @@ -63,6 +79,51 @@ const generateId = (prefix = "") => { return prefix ? `${prefix}-${uuid}` : uuid; }; +/** + * Post-processes the AI-generated test to preserve fields from the original partial test. + * @param {Object} generatedTest - The test generated by the AI + * @param {Object} [partialTest] - The original partial test provided by the user + * @returns {Object} The merged test with preserved fields from the partial test + */ +const postProcessTest = (generatedTest, partialTest) => { + if (!partialTest) { + return generatedTest; + } + + const result = { ...generatedTest }; + + // Preserve explicitly provided fields from the partial test + if (partialTest.testId && !result.testId) { + result.testId = partialTest.testId; + } + if (partialTest.sourceLocation) { + result.sourceLocation = partialTest.sourceLocation; + } + if (partialTest.description) { + result.description = partialTest.description; + } + if (partialTest.contentPath) { + result.contentPath = partialTest.contentPath; + } + if (partialTest.detectSteps !== undefined) { + result.detectSteps = partialTest.detectSteps; + } + if (partialTest.runOn) { + result.runOn = partialTest.runOn; + } + if (partialTest.openApi) { + result.openApi = partialTest.openApi; + } + if (partialTest.setup) { + result.setup = partialTest.setup; + } + if (partialTest.cleanup) { + result.cleanup = partialTest.cleanup; + } + + return result; +}; + /** * Analyzes document content using AI to generate test specifications. * @@ -73,6 +134,7 @@ const generateId = (prefix = "") => { * @param {string} [options.model] - LLM model override (takes precedence over defaults) * @param {number} [options.maxContentLength] - Maximum content length before truncation (default: 100000) * @param {Array} [options.files] - Optional images/screenshots to include for multimodal analysis + * @param {Object} [options.test] - Optional partial test to use as starting point for generation * @returns {Promise} A promise that resolves to a spec_v3 compatible specification * @throws {Error} If content is not provided or generation fails * @@ -82,6 +144,13 @@ const generateId = (prefix = "") => { * filePath: "docs/getting-started.md", * config: { integrations: { anthropic: { apiKey: "sk-..." } } } * }); + * + * @example + * // With a partial test + * const spec = await analyze({ + * content: "# Getting Started\n\nNavigate to https://example.com...", + * test: { testId: "my-test", description: "Verify getting started guide" } + * }); */ const analyze = async ({ content, @@ -90,6 +159,7 @@ const analyze = async ({ model, maxContentLength = DEFAULT_MAX_CONTENT_LENGTH, files, + test, }) => { // Validate required input if (!content || typeof content !== "string") { @@ -101,6 +171,7 @@ const analyze = async ({ content, filePath, maxContentLength, + test, }); // Get the test schema for structured output @@ -131,13 +202,17 @@ const analyze = async ({ ); } - return result.object; + // Post-process to preserve fields from the partial test + const finalTest = postProcessTest(result.object, test); + + return finalTest; }; module.exports = { analyze, buildAnalysisPrompt, + postProcessTest, ANALYSIS_SYSTEM_PROMPT, DEFAULT_MAX_CONTENT_LENGTH, }; diff --git a/resolver/src/analyze.test.js b/resolver/src/analyze.test.js index e45f14a..abfba7f 100644 --- a/resolver/src/analyze.test.js +++ b/resolver/src/analyze.test.js @@ -1,20 +1,22 @@ const crypto = require("crypto"); -(async () => { +// Import the analyze module +const { + analyze, + buildAnalysisPrompt, + postProcessTest, + ANALYSIS_SYSTEM_PROMPT, + DEFAULT_MAX_CONTENT_LENGTH, +} = require("./analyze"); + +before(async function () { const { expect } = await import("chai"); - const sinon = await import("sinon"); + global.expect = expect; +}); - // Import the analyze module - const { - analyze, - buildAnalysisPrompt, - ANALYSIS_SYSTEM_PROMPT, - DEFAULT_MAX_CONTENT_LENGTH, - } = require("./analyze"); - - describe("Analyze Module", function () { - // Increase timeout for real API calls - this.timeout(120000); +describe("Analyze Module", function () { + // Increase timeout for real API calls + this.timeout(120000); describe("buildAnalysisPrompt", function () { it("should build prompt with content only", function () { @@ -58,6 +60,48 @@ const crypto = require("crypto"); expect(prompt).to.include(shortContent); expect(prompt).to.not.include("[Content truncated"); }); + + it("should include partial test when provided", function () { + const partialTest = { + testId: "my-custom-test", + description: "Test the getting started guide", + }; + const prompt = buildAnalysisPrompt({ + content: "Test content", + test: partialTest, + }); + + expect(prompt).to.include("--- Partial Test (use as starting point) ---"); + expect(prompt).to.include("my-custom-test"); + expect(prompt).to.include("Test the getting started guide"); + expect(prompt).to.include("--- End Partial Test ---"); + expect(prompt).to.include("Complete and expand the partial test"); + }); + + it("should include partial test with steps", function () { + const partialTest = { + testId: "test-with-steps", + steps: [ + { goTo: { url: "https://example.com" } }, + ], + }; + const prompt = buildAnalysisPrompt({ + content: "Test content", + test: partialTest, + }); + + expect(prompt).to.include("test-with-steps"); + expect(prompt).to.include("https://example.com"); + }); + + it("should use default prompt when no partial test provided", function () { + const prompt = buildAnalysisPrompt({ + content: "Test content", + }); + + expect(prompt).to.not.include("--- Partial Test"); + expect(prompt).to.include("Generate a Doc Detective specification"); + }); }); describe("ANALYSIS_SYSTEM_PROMPT", function () { @@ -72,6 +116,14 @@ const crypto = require("crypto"); expect(ANALYSIS_SYSTEM_PROMPT).to.include("checkLink"); expect(ANALYSIS_SYSTEM_PROMPT).to.include("httpRequest"); }); + + it("should include instructions for handling partial tests", function () { + expect(ANALYSIS_SYSTEM_PROMPT).to.include("When a partial test is provided"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("starting point"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("Fill in any missing required fields"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("Expand incomplete steps"); + expect(ANALYSIS_SYSTEM_PROMPT).to.include("Preserve any existing field values"); + }); }); describe("DEFAULT_MAX_CONTENT_LENGTH", function () { @@ -80,6 +132,217 @@ const crypto = require("crypto"); }); }); + describe("postProcessTest", function () { + it("should return generated test unchanged when no partial test provided", function () { + const generatedTest = { + testId: "generated-id", + description: "Generated description", + steps: [{ goTo: { url: "https://example.com" } }], + }; + + const result = postProcessTest(generatedTest, undefined); + + expect(result).to.deep.equal(generatedTest); + }); + + it("should return generated test unchanged when partial test is null", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + + const result = postProcessTest(generatedTest, null); + + expect(result).to.deep.equal(generatedTest); + }); + + it("should preserve testId from partial test when generated test lacks it", function () { + const generatedTest = { + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + testId: "my-custom-id", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.testId).to.equal("my-custom-id"); + }); + + it("should not override testId when generated test already has one", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + testId: "partial-id", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.testId).to.equal("generated-id"); + }); + + it("should preserve sourceLocation from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + sourceLocation: { + file: "/docs/test.md", + startLine: 10, + endLine: 20, + }, + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.sourceLocation).to.deep.equal(partialTest.sourceLocation); + }); + + it("should preserve description from partial test", function () { + const generatedTest = { + testId: "generated-id", + description: "AI generated description", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + description: "User provided description", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.description).to.equal("User provided description"); + }); + + it("should preserve contentPath from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + contentPath: "/docs/getting-started.md", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.contentPath).to.equal("/docs/getting-started.md"); + }); + + it("should preserve detectSteps from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + detectSteps: false, + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.detectSteps).to.equal(false); + }); + + it("should preserve runOn from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + runOn: ["firefox", "chrome"], + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.runOn).to.deep.equal(["firefox", "chrome"]); + }); + + it("should preserve openApi from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + openApi: [{ path: "./openapi.yaml" }], + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.openApi).to.deep.equal([{ path: "./openapi.yaml" }]); + }); + + it("should preserve setup from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + setup: "./setup.spec.json", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.setup).to.equal("./setup.spec.json"); + }); + + it("should preserve cleanup from partial test", function () { + const generatedTest = { + testId: "generated-id", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + cleanup: "./cleanup.spec.json", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.cleanup).to.equal("./cleanup.spec.json"); + }); + + it("should preserve multiple fields from partial test", function () { + const generatedTest = { + testId: "generated-id", + description: "Generated", + steps: [{ goTo: { url: "https://example.com" } }], + }; + const partialTest = { + testId: "custom-id", + description: "Custom description", + contentPath: "/docs/test.md", + setup: "./setup.json", + cleanup: "./cleanup.json", + }; + + const result = postProcessTest(generatedTest, partialTest); + + // testId not overridden because generated test already has one + expect(result.testId).to.equal("generated-id"); + // Other fields are preserved + expect(result.description).to.equal("Custom description"); + expect(result.contentPath).to.equal("/docs/test.md"); + expect(result.setup).to.equal("./setup.json"); + expect(result.cleanup).to.equal("./cleanup.json"); + }); + + it("should keep generated steps when partial test has no steps", function () { + const generatedTest = { + testId: "generated-id", + steps: [ + { goTo: { url: "https://example.com" } }, + { find: { elementText: "Welcome" } }, + ], + }; + const partialTest = { + testId: "custom-id", + }; + + const result = postProcessTest(generatedTest, partialTest); + + expect(result.steps).to.deep.equal(generatedTest.steps); + }); + }); + describe("analyze", function () { describe("input validation", function () { it("should throw error when content is not provided", async function () { @@ -249,6 +512,126 @@ The response should have a 200 status code.`; expect(validation.valid).to.be.true; }); }); + + describe("partial test input", function () { + it("should preserve testId from partial test", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await analyze({ + content: "Navigate to https://example.com and click the login button.", + test: { + testId: "my-custom-test-id", + }, + }); + + expect(result).to.be.an("object"); + expect(result.steps).to.be.an("array"); + // testId may or may not be preserved depending on AI generation + // but if AI doesn't generate one, ours should be used + }); + + it("should preserve description from partial test", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await analyze({ + content: "Navigate to https://example.com.", + test: { + description: "My custom test description", + }, + }); + + expect(result).to.be.an("object"); + expect(result.description).to.equal("My custom test description"); + }); + + it("should preserve contentPath from partial test", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await analyze({ + content: "Check https://example.com/api returns 200.", + test: { + contentPath: "/docs/api-guide.md", + }, + }); + + expect(result).to.be.an("object"); + expect(result.contentPath).to.equal("/docs/api-guide.md"); + }); + + it("should preserve setup and cleanup from partial test", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await analyze({ + content: "Visit https://example.com.", + test: { + setup: "./setup.spec.json", + cleanup: "./cleanup.spec.json", + }, + }); + + expect(result).to.be.an("object"); + expect(result.setup).to.equal("./setup.spec.json"); + expect(result.cleanup).to.equal("./cleanup.spec.json"); + }); + + it("should expand partial test with incomplete steps", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const result = await analyze({ + content: `# Getting Started + +First, navigate to https://example.com. +Then click the "Sign Up" button. +Finally, fill in the registration form.`, + test: { + testId: "registration-test", + description: "Test the registration flow", + }, + }); + + expect(result).to.be.an("object"); + expect(result.steps).to.be.an("array"); + expect(result.steps.length).to.be.at.least(1); + expect(result.description).to.equal("Test the registration flow"); + }); + + it("should generate valid test when partial test provided", async function () { + // Skip if no API key is set + if (!process.env.ANTHROPIC_API_KEY) { + this.skip(); + } + + const { validate } = require("doc-detective-common"); + + const result = await analyze({ + content: "Go to https://example.com and verify the page loads.", + test: { + testId: "partial-test", + description: "Verify example.com loads", + detectSteps: false, + }, + }); + + const validation = validate({ schemaKey: "test_v3", object: result }); + expect(validation.valid).to.be.true; + expect(result.description).to.equal("Verify example.com loads"); + expect(result.detectSteps).to.equal(false); + }); + }); }); }); -})(); From da4e6782b11c340e4cf6cc87d3e95a2c8c1b58d4 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Wed, 10 Dec 2025 18:10:15 -0800 Subject: [PATCH 67/90] Set preview version --- common/package-lock.json | 20 ++++++++++---------- common/package.json | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/common/package-lock.json b/common/package-lock.json index f3e1ac8..2791ad9 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -1,18 +1,18 @@ { "name": "doc-detective-common", - "version": "3.6.0", + "version": "3.7.0-preview.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective-common", - "version": "3.6.0", + "version": "3.7.0-preview.0", "license": "AGPL-3.0-only", "dependencies": { - "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/anthropic": "^2.0.54", "@ai-sdk/openai": "^2.0.80", "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ai": "^5.0.108", + "ai": "^5.0.109", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", @@ -28,9 +28,9 @@ } }, "node_modules/@ai-sdk/anthropic": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.53.tgz", - "integrity": "sha512-ih7NV+OFSNWZCF+tYYD7ovvvM+gv7TRKQblpVohg2ipIwC9Y0TirzocJVREzZa/v9luxUwFbsPji++DUDWWxsg==", + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.54.tgz", + "integrity": "sha512-6OSFMkt5NkAchH7o0W+dI2h6yR8EPXx7Yl6txyh0gadLlkf1UU/ScyoYlkxAW8UtGju/+apvwVTdLYEQuIsVVQ==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.0", @@ -304,9 +304,9 @@ } }, "node_modules/ai": { - "version": "5.0.108", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.108.tgz", - "integrity": "sha512-Jex3Lb7V41NNpuqJHKgrwoU6BCLHdI1Pg4qb4GJH4jRIDRXUBySJErHjyN4oTCwbiYCeb/8II9EnqSRPq9EifA==", + "version": "5.0.109", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.109.tgz", + "integrity": "sha512-tW8K4Z0bcYH9PzP7gMmPilgBwgpylEL25bRtWruUnrTS45S6ryNJ6YSEh6mZajlIEDS6bcur7srdXVGERxjVXQ==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/gateway": "2.0.18", diff --git a/common/package.json b/common/package.json index 4c181f9..6c7680b 100644 --- a/common/package.json +++ b/common/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective-common", - "version": "3.6.0", + "version": "3.7.0-preview.0", "description": "Shared components for Doc Detective projects.", "main": "src/index.js", "scripts": { @@ -25,10 +25,10 @@ "sinon": "^21.0.0" }, "dependencies": { - "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/anthropic": "^2.0.54", "@ai-sdk/openai": "^2.0.80", "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ai": "^5.0.108", + "ai": "^5.0.109", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", From e3184cde33a73eaad8b5d9701ba55fd8ce4a5bbe Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Wed, 10 Dec 2025 18:13:32 -0800 Subject: [PATCH 68/90] Set preview version --- resolver/package-lock.json | 239 ++++++++++++++++++++++++++++++++----- resolver/package.json | 6 +- 2 files changed, 209 insertions(+), 36 deletions(-) diff --git a/resolver/package-lock.json b/resolver/package-lock.json index b98b326..2bedfb5 100644 --- a/resolver/package-lock.json +++ b/resolver/package-lock.json @@ -1,21 +1,21 @@ { "name": "doc-detective-resolver", - "version": "3.6.1", + "version": "3.7.0-preview.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective-resolver", - "version": "3.6.1", + "version": "3.7.0-preview.0", "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "axios": "^1.13.2", - "doc-detective-common": "file:../common", + "doc-detective-common": "^3.7.0-preview.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" + "posthog-node": "^5.17.2" }, "devDependencies": { "body-parser": "^2.2.1", @@ -28,27 +28,82 @@ "yaml": "^2.8.2" } }, - "../common": { - "name": "doc-detective-common", - "version": "3.6.0", - "license": "AGPL-3.0-only", + "node_modules/@ai-sdk/anthropic": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.54.tgz", + "integrity": "sha512-6OSFMkt5NkAchH7o0W+dI2h6yR8EPXx7Yl6txyh0gadLlkf1UU/ScyoYlkxAW8UtGju/+apvwVTdLYEQuIsVVQ==", + "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "^2.0.53", - "@ai-sdk/openai": "^2.0.80", - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ai": "^5.0.108", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.13.2", - "yaml": "^2.8.2", - "zod": "^4.1.13" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" }, - "devDependencies": { - "chai": "^6.2.1", - "mocha": "^11.7.5", - "sinon": "^21.0.0" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", + "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@vercel/oidc": "3.0.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "2.0.80", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.80.tgz", + "integrity": "sha512-tNHuraF11db+8xJEDBoU9E3vMcpnHFKRhnLQ3DQX2LnEzfPB9DksZ8rE+yVuDN1WRW9cm2OWAhgHFgVKs7ICuw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" } }, "node_modules/@apidevtools/json-schema-ref-parser": { @@ -136,6 +191,15 @@ "jsep": "^0.4.0||^1.0.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -147,9 +211,9 @@ } }, "node_modules/@posthog/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.0.tgz", - "integrity": "sha512-d6ZV4grpzeH/6/LP8quMVpSjY1puRkrqfwcPvGRKUAX7tb7YHyp/zMiTDuJmOFbpUxAMBXH5nDwcPiyCY2WGzA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.1.tgz", + "integrity": "sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.6" @@ -197,12 +261,27 @@ "node": ">=4" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "peer": true }, + "node_modules/@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -240,6 +319,24 @@ "node": ">= 0.6" } }, + "node_modules/ai": { + "version": "5.0.109", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.109.tgz", + "integrity": "sha512-tW8K4Z0bcYH9PzP7gMmPilgBwgpylEL25bRtWruUnrTS45S6ryNJ6YSEh6mZajlIEDS6bcur7srdXVGERxjVXQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "2.0.18", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -256,6 +353,44 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.1" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -687,8 +822,23 @@ } }, "node_modules/doc-detective-common": { - "resolved": "../common", - "link": true + "version": "3.7.0-preview.0", + "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.7.0-preview.0.tgz", + "integrity": "sha512-13HnawzR0J5fIoUp5irvmooiU5LCLpOCiF8wf3UkpyqQIWlQ1gZhNH08YD6zGfgc3ddUmN+r965flucDbIGkaQ==", + "license": "AGPL-3.0-only", + "dependencies": { + "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/openai": "^2.0.80", + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.109", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "yaml": "^2.8.2", + "zod": "^4.1.13" + } }, "node_modules/dotenv": { "version": "17.2.3", @@ -829,6 +979,15 @@ "node": ">= 0.6" } }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -1350,6 +1509,12 @@ "node": ">= 10.16.0" } }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, "node_modules/json-schema-faker": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", @@ -1763,12 +1928,12 @@ "license": "ISC" }, "node_modules/posthog-node": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.0.tgz", - "integrity": "sha512-M+ftj0kLJk6wVF1xW5cStSany0LBC6YDVO7RPma2poo+PrpeiTk+ovhqcIqWAySDdTcBHJfBV9aIFYWPl2y6kg==", + "version": "5.17.2", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", + "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", "license": "MIT", "dependencies": { - "@posthog/core": "1.7.0" + "@posthog/core": "1.7.1" }, "engines": { "node": ">=20" @@ -2550,7 +2715,6 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -2677,6 +2841,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/resolver/package.json b/resolver/package.json index 8ef3a0c..c896fee 100644 --- a/resolver/package.json +++ b/resolver/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective-resolver", - "version": "3.6.1", + "version": "3.7.0-preview.0", "description": "Detect and resolve docs into Doc Detective tests.", "main": "src/index.js", "scripts": { @@ -27,10 +27,10 @@ "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "axios": "^1.13.2", - "doc-detective-common": "file:../common", + "doc-detective-common": "^3.7.0-preview.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" + "posthog-node": "^5.17.2" }, "devDependencies": { "body-parser": "^2.2.1", From 8af1768b153d1e94a6015edd27f9dcc934c7df3f Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Wed, 10 Dec 2025 18:29:33 -0800 Subject: [PATCH 69/90] Set preview version --- core/package-lock.json | 785 ++++++++++++++++++++++------------------- core/package.json | 14 +- 2 files changed, 425 insertions(+), 374 deletions(-) diff --git a/core/package-lock.json b/core/package-lock.json index 104f932..f2188ec 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1,33 +1,33 @@ { "name": "doc-detective-core", - "version": "3.6.2", + "version": "3.7.0-preview.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective-core", - "version": "3.6.2", + "version": "3.7.0-preview.0", "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@puppeteer/browsers": "^2.10.13", + "@puppeteer/browsers": "^2.11.0", "ajv": "^8.17.1", - "appium": "^3.1.1", - "appium-chromium-driver": "^2.0.3", + "appium": "^3.1.2", + "appium-chromium-driver": "^2.0.4", "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "file:../common", - "doc-detective-resolver": "file:../resolver", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", "json-schema-faker": "^0.5.9", "pixelmatch": "^7.1.0", "pngjs": "^7.0.0", - "posthog-node": "^5.15.0", + "posthog-node": "^5.17.2", "tree-kill": "^1.2.2", "webdriverio": "^9.21.0" }, @@ -72,51 +72,82 @@ "@img/sharp-win32-x64": "^0.34.5" } }, - "../common": { - "name": "doc-detective-common", - "version": "3.6.0", - "license": "AGPL-3.0-only", + "node_modules/@ai-sdk/anthropic": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.54.tgz", + "integrity": "sha512-6OSFMkt5NkAchH7o0W+dI2h6yR8EPXx7Yl6txyh0gadLlkf1UU/ScyoYlkxAW8UtGju/+apvwVTdLYEQuIsVVQ==", + "license": "Apache-2.0", "dependencies": { - "@ai-sdk/anthropic": "^2.0.53", - "@ai-sdk/openai": "^2.0.80", - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ai": "^5.0.108", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.13.2", - "yaml": "^2.8.2", - "zod": "^4.1.13" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" }, - "devDependencies": { - "chai": "^6.2.1", - "mocha": "^11.7.5", - "sinon": "^21.0.0" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" } }, - "../resolver": { - "name": "doc-detective-resolver", - "version": "3.6.1", - "license": "AGPL-3.0-only", + "node_modules/@ai-sdk/gateway": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", + "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", + "license": "Apache-2.0", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ajv": "^8.17.1", - "axios": "^1.13.2", - "doc-detective-common": "file:../common", - "dotenv": "^17.2.3", - "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@vercel/oidc": "3.0.5" }, - "devDependencies": { - "body-parser": "^2.2.1", - "chai": "^6.2.1", - "express": "^5.2.1", - "mocha": "^11.7.5", - "proxyquire": "^2.1.3", - "semver": "^7.7.3", - "sinon": "^21.0.0", - "yaml": "^2.8.2" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "2.0.80", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.80.tgz", + "integrity": "sha512-tNHuraF11db+8xJEDBoU9E3vMcpnHFKRhnLQ3DQX2LnEzfPB9DksZ8rE+yVuDN1WRW9cm2OWAhgHFgVKs7ICuw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", + "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" } }, "node_modules/@apidevtools/json-schema-ref-parser": { @@ -135,30 +166,30 @@ } }, "node_modules/@appium/base-driver": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", - "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.2.tgz", + "integrity": "sha512-AxCYznylRw4xpOx30dAIQ8m5GsVM9ob/MPwc/KyiKhtofLNxQQlFLvLs7SeX7s8iwvwr0puMasOqlWrWy3gVbA==", "license": "Apache-2.0", "dependencies": { - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", + "@appium/support": "^7.0.4", + "@appium/types": "^1.1.2", "@colors/colors": "1.6.0", "async-lock": "1.4.1", "asyncbox": "3.0.0", "axios": "1.13.2", "bluebird": "3.7.2", - "body-parser": "2.2.0", - "express": "5.1.0", + "body-parser": "2.2.1", + "express": "5.2.1", "fastest-levenshtein": "1.0.16", "http-status-codes": "2.3.0", "lodash": "4.17.21", - "lru-cache": "11.2.2", + "lru-cache": "11.2.4", "method-override": "3.0.0", "morgan": "1.10.1", "path-to-regexp": "8.3.0", "serve-favicon": "2.5.1", "source-map-support": "0.5.21", - "type-fest": "5.2.0" + "type-fest": "5.3.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -168,56 +199,14 @@ "spdy": "4.0.2" } }, - "node_modules/@appium/base-driver/node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/@appium/base-plugin": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", - "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.5.tgz", + "integrity": "sha512-w27EqXQ3zY7xKp61IizbzhZGlxQvFr8uKxeELP5TU/+YxnjU8MyVYmWCG7RXp0dh9n7mZen/WPjZtvqdiBOsMQ==", "license": "Apache-2.0", "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/support": "^7.0.3" + "@appium/base-driver": "^10.1.2", + "@appium/support": "^7.0.4" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -225,12 +214,12 @@ } }, "node_modules/@appium/docutils": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", - "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.2.0.tgz", + "integrity": "sha512-bwZIShYLRnWCRdGEgjBX+POXyI0X8fbZ3FNHWDlNzYjCBodYckiMw8X48WDwMRd0AeP5mzjBbHSpH7DKfebuFg==", "license": "Apache-2.0", "dependencies": { - "@appium/support": "^7.0.3", + "@appium/support": "^7.0.4", "chalk": "4.1.2", "consola": "3.4.2", "diff": "8.0.2", @@ -239,9 +228,9 @@ "pkg-dir": "5.0.0", "read-pkg": "5.2.0", "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", - "yaml": "2.8.1", + "teen_process": "3.0.4", + "type-fest": "5.3.0", + "yaml": "2.8.2", "yargs": "18.0.0", "yargs-parser": "22.0.0" }, @@ -337,14 +326,14 @@ } }, "node_modules/@appium/logger": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.2.tgz", - "integrity": "sha512-288dCO+w9xKZltR3tOb7NOajqwS9wqy6f9a+rhDOpNZ4AemKM8C8+Mlsx6gGEAajlFMF0FaGH/f5TUjUBT/L2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.3.tgz", + "integrity": "sha512-x1ROyUZP73RwdfgeYUgYkAAVbjf4QQENAACTjPxzIj7qA4/EyhXvv/Py8b6SPxphW7m9ialQjpS0FwgQ3nZUfw==", "license": "ISC", "dependencies": { "console-control-strings": "1.1.0", "lodash": "4.17.21", - "lru-cache": "11.2.2", + "lru-cache": "11.2.4", "set-blocking": "2.0.0" }, "engines": { @@ -367,14 +356,14 @@ } }, "node_modules/@appium/support": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", - "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.4.tgz", + "integrity": "sha512-xIK7cFzouZJLIG6RMmg50M+EsILSeO9e9sSkR4xNSaJajaop7LtpkbMfO5JpTgdNiIUYyIsr/3TusQhxnpPNvw==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^2.0.2", - "@appium/tsconfig": "^1.1.0", - "@appium/types": "^1.1.1", + "@appium/logger": "^2.0.3", + "@appium/tsconfig": "^1.1.1", + "@appium/types": "^1.1.2", "@colors/colors": "1.6.0", "archiver": "7.0.1", "axios": "1.13.2", @@ -382,9 +371,9 @@ "bluebird": "3.7.2", "bplist-creator": "0.1.1", "bplist-parser": "0.3.2", - "form-data": "4.0.4", + "form-data": "4.0.5", "get-stream": "6.0.1", - "glob": "11.0.3", + "glob": "13.0.0", "jsftp": "2.1.3", "klaw": "4.1.0", "lockfile": "1.0.4", @@ -402,10 +391,10 @@ "shell-quote": "1.8.3", "source-map-support": "0.5.21", "supports-color": "8.1.1", - "teen_process": "3.0.2", - "type-fest": "5.2.0", + "teen_process": "3.0.4", + "type-fest": "5.3.0", "uuid": "13.0.0", - "which": "5.0.0", + "which": "6.0.0", "yauzl": "3.2.0" }, "engines": { @@ -417,12 +406,12 @@ } }, "node_modules/@appium/tsconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", - "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.1.tgz", + "integrity": "sha512-ikjo037sWgY2Oy0HRPGnrKHnOdUh9JyzstD7E6HlFqcZu8hvOP1hDQmKdoBTz8gkmSbZWcMRZmWaL3Yqaz2pLw==", "license": "Apache-2.0", "dependencies": { - "@tsconfig/node20": "20.1.6" + "@tsconfig/node20": "20.1.8" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -430,15 +419,15 @@ } }, "node_modules/@appium/types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", - "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.2.tgz", + "integrity": "sha512-BDyX99GCXWqsfeDxsqsvb6EIfQD7SLTXcCbmcI1PKDTK2wg9znKOtE0YLzXgI6TFQV3+40Xs6za6La/Mv8/rVQ==", "license": "Apache-2.0", "dependencies": { - "@appium/logger": "^2.0.2", + "@appium/logger": "^2.0.3", "@appium/schema": "^1.0.0", - "@appium/tsconfig": "^1.1.0", - "type-fest": "5.2.0" + "@appium/tsconfig": "^1.1.1", + "type-fest": "5.3.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0", @@ -1321,6 +1310,15 @@ "jsep": "^0.4.0||^1.0.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1332,9 +1330,9 @@ } }, "node_modules/@posthog/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.0.tgz", - "integrity": "sha512-d6ZV4grpzeH/6/LP8quMVpSjY1puRkrqfwcPvGRKUAX7tb7YHyp/zMiTDuJmOFbpUxAMBXH5nDwcPiyCY2WGzA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.7.1.tgz", + "integrity": "sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.6" @@ -1360,9 +1358,9 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.13", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", - "integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.11.0.tgz", + "integrity": "sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==", "license": "Apache-2.0", "dependencies": { "debug": "^4.4.3", @@ -1381,9 +1379,9 @@ } }, "node_modules/@sidvind/better-ajv-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", - "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.1.tgz", + "integrity": "sha512-6arF1ssKxItxgitPYXafUoLmsVBA6K7m9+ZGj6hLDoBl7nWpJ33EInwQUdHTle2METeWGxgQiqSex20KZRykew==", "license": "Apache-2.0", "dependencies": { "kleur": "^4.1.0" @@ -1405,6 +1403,12 @@ "text-hex": "1.0.x" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -1412,9 +1416,9 @@ "license": "MIT" }, "node_modules/@tsconfig/node20": { - "version": "20.1.6", - "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", - "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", + "version": "20.1.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.8.tgz", + "integrity": "sha512-Em+IdPfByIzWRRpqWL4Z7ArLHZGxmc36BxE3jCz9nBFSm+5aLaPMZyjwu4yetvyKXeogWcxik4L1jB5JTWfw7A==", "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1490,6 +1494,15 @@ "@types/node": "*" } }, + "node_modules/@vercel/oidc": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", + "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, "node_modules/@vue/compiler-core": { "version": "3.5.25", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz", @@ -1807,6 +1820,24 @@ "node": ">= 14" } }, + "node_modules/ai": { + "version": "5.0.109", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.109.tgz", + "integrity": "sha512-tW8K4Z0bcYH9PzP7gMmPilgBwgpylEL25bRtWruUnrTS45S6ryNJ6YSEh6mZajlIEDS6bcur7srdXVGERxjVXQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "2.0.18", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.18", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -1823,6 +1854,15 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", + "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.1" + } + }, "node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", @@ -1840,6 +1880,18 @@ } } }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1868,20 +1920,20 @@ } }, "node_modules/appium": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.1.tgz", - "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/appium/-/appium-3.1.2.tgz", + "integrity": "sha512-MIifVZdSLdFBRY084PaaQyU8ilG+fgGoVdzGkRLj9Q8hZ2x/ENwjiOveyWLxcjsWMYYwUtm3TTKRvWGrJvX3Iw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@appium/base-driver": "^10.1.1", - "@appium/base-plugin": "^3.0.4", - "@appium/docutils": "^2.1.2", - "@appium/logger": "^2.0.2", + "@appium/base-driver": "^10.1.2", + "@appium/base-plugin": "^3.0.5", + "@appium/docutils": "^2.2.0", + "@appium/logger": "^2.0.3", "@appium/schema": "^1.0.0", - "@appium/support": "^7.0.3", - "@appium/types": "^1.1.1", - "@sidvind/better-ajv-errors": "4.0.0", + "@appium/support": "^7.0.4", + "@appium/types": "^1.1.2", + "@sidvind/better-ajv-errors": "4.0.1", "ajv": "8.17.1", "ajv-formats": "3.0.1", "argparse": "2.0.1", @@ -1891,18 +1943,18 @@ "bluebird": "3.7.2", "lilconfig": "3.1.3", "lodash": "4.17.21", - "lru-cache": "11.2.2", + "lru-cache": "11.2.4", "ora": "5.4.1", "package-changed": "3.0.0", "resolve-from": "5.0.0", "semver": "7.7.3", "source-map-support": "0.5.21", - "teen_process": "3.0.2", - "type-fest": "5.2.0", + "teen_process": "3.0.4", + "type-fest": "5.3.0", "winston": "3.18.3", "wrap-ansi": "7.0.0", "ws": "8.18.3", - "yaml": "2.8.1" + "yaml": "2.8.2" }, "bin": { "appium": "index.js" @@ -1913,9 +1965,9 @@ } }, "node_modules/appium-chromium-driver": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/appium-chromium-driver/-/appium-chromium-driver-2.0.3.tgz", - "integrity": "sha512-qT3ldg0EFW9yuU0E/11ME4e7BIx5A17Ti+zvv1JR9soflJd5ruCY+j+6IP18RCKwYgBk152ey85cD6JvotL0Jw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/appium-chromium-driver/-/appium-chromium-driver-2.0.4.tgz", + "integrity": "sha512-L3UO1bzD/rOOkaN5pyxpbJjwvhjlkW2xn5atIKECtw49tNEBXvI9xGdBx4mzrFaQi0bqQmk55ivEQnqYvwMSiw==", "hasShrinkwrap": true, "license": "Apache-2.0", "dependencies": { @@ -2804,9 +2856,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/appium-adb": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.0.3.tgz", - "integrity": "sha512-fJIEikjVoKsj9PfM2iPBn4kEMHy78ZY6PBC4pTiSv0rlAgxnScQW9OLm2l4wEaE8ODwnY2zJZDHehEGZ2b79fg==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.0.5.tgz", + "integrity": "sha512-plS0gR2YSdwZMVt86P76MtUUFc4k5MHFCm67BknzApWXpQ+9Dn4I70G2XmRnpoaGevfM/uj8phze1TAKYbyATQ==", "license": "Apache-2.0", "dependencies": { "@appium/support": "^7.0.0-rc.1", @@ -2826,9 +2878,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/appium-chromedriver": { - "version": "8.0.21", - "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.21.tgz", - "integrity": "sha512-l5SUc+VAykdFvwWwA7C6Kg4SdH45d1N/lyGvj/60b8W3Fv/HhfLDM0b1yhjH+leO7bBjS80iQI+z+P+1Fk5ydw==", + "version": "8.0.24", + "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.24.tgz", + "integrity": "sha512-OL2OoICSwBzv7k08MnVEemRGTCL+cHxyOkPWxg4gWQ4nv76+U/rKGtU9b7MP0j1rC7rdpZGjGuyDcsD3U7BZqg==", "license": "Apache-2.0", "dependencies": { "@appium/base-driver": "^10.0.0-rc.2", @@ -2896,9 +2948,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -3089,12 +3141,6 @@ "node": ">= 0.8" } }, - "node_modules/appium-chromium-driver/node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/appium-chromium-driver/node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -3530,15 +3576,16 @@ "license": "ISC" }, "node_modules/appium-chromium-driver/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/content-type": { @@ -3958,9 +4005,9 @@ "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -3971,7 +4018,11 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/find-up": { @@ -4369,13 +4420,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "optional": true - }, "node_modules/appium-chromium-driver/node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -4394,28 +4438,23 @@ "optional": true }, "node_modules/appium-chromium-driver/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" - } - }, - "node_modules/appium-chromium-driver/node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/http-status-codes": { @@ -4684,12 +4723,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/appium-chromium-driver/node_modules/lazystream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -4870,15 +4903,19 @@ } }, "node_modules/appium-chromium-driver/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/appium-chromium-driver/node_modules/mimic-fn": { @@ -5375,15 +5412,15 @@ } }, "node_modules/appium-chromium-driver/node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.10" @@ -5569,23 +5606,9 @@ } }, "node_modules/appium-chromium-driver/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/appium-chromium-driver/node_modules/safe-stable-stringify": { @@ -5679,6 +5702,26 @@ "node": ">= 0.6" } }, + "node_modules/appium-chromium-driver/node_modules/serve-favicon/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", @@ -6018,6 +6061,26 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/appium-chromium-driver/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/appium-chromium-driver/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -17011,23 +17074,43 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", - "debug": "^4.4.0", + "debug": "^4.4.3", "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", + "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/boolbase": { @@ -17975,12 +18058,38 @@ } }, "node_modules/doc-detective-common": { - "resolved": "../common", - "link": true + "version": "3.7.0-preview.0", + "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.7.0-preview.0.tgz", + "integrity": "sha512-13HnawzR0J5fIoUp5irvmooiU5LCLpOCiF8wf3UkpyqQIWlQ1gZhNH08YD6zGfgc3ddUmN+r965flucDbIGkaQ==", + "license": "AGPL-3.0-only", + "dependencies": { + "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/openai": "^2.0.80", + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.109", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "yaml": "^2.8.2", + "zod": "^4.1.13" + } }, "node_modules/doc-detective-resolver": { - "resolved": "../resolver", - "link": true + "version": "3.7.0-preview.0", + "resolved": "https://registry.npmjs.org/doc-detective-resolver/-/doc-detective-resolver-3.7.0-preview.0.tgz", + "integrity": "sha512-sL9KCJc2JX2RJjBl0inicCF4l9bNMCxWW8fa/xQXWdKQKI3zCADf8DKYjxMn2lr8LOSLSmSbJ1FFl/+krGEXbw==", + "license": "AGPL-3.0-only", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ajv": "^8.17.1", + "axios": "^1.13.2", + "doc-detective-common": "^3.7.0-preview.0", + "dotenv": "^17.2.3", + "json-schema-faker": "^0.5.9", + "posthog-node": "^5.17.2" + } }, "node_modules/dom-serializer": { "version": "2.0.0", @@ -18135,21 +18244,6 @@ "node": ">=20.0.0" } }, - "node_modules/edgedriver/node_modules/which": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", - "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -18388,6 +18482,15 @@ "bare-events": "^2.7.0" } }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -18405,7 +18508,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -18445,48 +18547,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -18726,9 +18786,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -18942,21 +19002,15 @@ } }, "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "license": "ISC", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", + "minimatch": "^10.1.1", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, "engines": { "node": "20 || >=22" }, @@ -19558,21 +19612,6 @@ "node": ">=16" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jq-web": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/jq-web/-/jq-web-0.6.2.tgz", @@ -20022,10 +20061,10 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "license": "ISC", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -21024,12 +21063,12 @@ } }, "node_modules/posthog-node": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.0.tgz", - "integrity": "sha512-M+ftj0kLJk6wVF1xW5cStSany0LBC6YDVO7RPma2poo+PrpeiTk+ovhqcIqWAySDdTcBHJfBV9aIFYWPl2y6kg==", + "version": "5.17.2", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", + "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", "license": "MIT", "dependencies": { - "@posthog/core": "1.7.0" + "@posthog/core": "1.7.1" }, "engines": { "node": ">=20" @@ -22215,9 +22254,9 @@ } }, "node_modules/teen_process": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", - "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.4.tgz", + "integrity": "sha512-NQA/5PdJWEAxuYoBRW7RajnAyWmfh5iGMY1kEXiAzobtv0ztERcfDnfszpUTuvhFXrvh3E4GvHt9yWbS/EndzQ==", "license": "Apache-2.0", "dependencies": { "bluebird": "^3.7.2", @@ -22307,9 +22346,9 @@ "license": "0BSD" }, "node_modules/type-fest": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", - "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.0.tgz", + "integrity": "sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -22599,9 +22638,9 @@ } }, "node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", "license": "ISC", "dependencies": { "isexe": "^3.1.1" @@ -22610,7 +22649,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/winston": { @@ -22847,15 +22886,18 @@ } }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -23021,6 +23063,15 @@ "engines": { "node": ">= 14" } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/core/package.json b/core/package.json index 5375a88..0dab27f 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective-core", - "version": "3.6.2", + "version": "3.7.0-preview.0", "description": "The doc testing framework.", "main": "src/index.js", "scripts": { @@ -29,22 +29,22 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@puppeteer/browsers": "^2.10.13", + "@puppeteer/browsers": "^2.11.0", "ajv": "^8.17.1", - "appium": "^3.1.1", - "appium-chromium-driver": "^2.0.3", + "appium": "^3.1.2", + "appium-chromium-driver": "^2.0.4", "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "file:../common", - "doc-detective-resolver": "file:../resolver", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", "json-schema-faker": "^0.5.9", "pixelmatch": "^7.1.0", "pngjs": "^7.0.0", - "posthog-node": "^5.15.0", + "posthog-node": "^5.17.2", "tree-kill": "^1.2.2", "webdriverio": "^9.21.0" }, From 2caf4bfe915573e31ec9c8fd2b4b3685465ac421 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 11 Dec 2025 11:22:39 -0800 Subject: [PATCH 70/90] Set preview version --- cli/package-lock.json | 55 ++++++++++++++++++++++--------------------- cli/package.json | 12 +++++----- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/cli/package-lock.json b/cli/package-lock.json index 7b61ed3..5780697 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1,24 +1,24 @@ { "name": "doc-detective", - "version": "3.5.1", + "version": "3.7.0-preview.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "doc-detective", - "version": "3.5.1", + "version": "3.7.0-preview.0", "license": "AGPL-3.0-only", "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", "axios": "^1.13.2", - "doc-detective-common": "file:../common", - "doc-detective-core": "file:../core", - "doc-detective-resolver": "file:../resolver", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-core": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", "ink": "^6.5.1", "ink-select-input": "^6.2.0", "ink-spinner": "^5.0.0", "js-yaml": "^4.1.1", - "react": "^19.2.0", + "react": "^19.2.1", "yaml": "^2.8.2", "yargs": "^17.7.2" }, @@ -28,7 +28,7 @@ "devDependencies": { "body-parser": "^2.2.1", "chai": "^6.2.1", - "express": "^5.1.0", + "express": "^5.2.1", "ink-testing-library": "^4.0.0", "mocha": "^11.7.5", "sinon": "^19.0.2" @@ -36,13 +36,13 @@ }, "../common": { "name": "doc-detective-common", - "version": "3.6.0", + "version": "3.7.0-preview.0", "license": "AGPL-3.0-only", "dependencies": { - "@ai-sdk/anthropic": "^2.0.53", + "@ai-sdk/anthropic": "^2.0.54", "@ai-sdk/openai": "^2.0.80", "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ai": "^5.0.108", + "ai": "^5.0.109", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", @@ -59,28 +59,28 @@ }, "../core": { "name": "doc-detective-core", - "version": "3.6.2", + "version": "3.7.0-preview.0", "hasInstallScript": true, "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "@ffmpeg-installer/ffmpeg": "^1.1.0", - "@puppeteer/browsers": "^2.10.13", + "@puppeteer/browsers": "^2.11.0", "ajv": "^8.17.1", - "appium": "^3.1.1", - "appium-chromium-driver": "^2.0.3", + "appium": "^3.1.2", + "appium-chromium-driver": "^2.0.4", "appium-geckodriver": "^2.1.2", "appium-safari-driver": "^4.1.2", "axios": "^1.13.2", - "doc-detective-common": "file:../common", - "doc-detective-resolver": "file:../resolver", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", "dotenv": "^17.2.3", "geckodriver": "^6.1.0", "jq-web": "^0.6.2", "json-schema-faker": "^0.5.9", "pixelmatch": "^7.1.0", "pngjs": "^7.0.0", - "posthog-node": "^5.15.0", + "posthog-node": "^5.17.2", "tree-kill": "^1.2.2", "webdriverio": "^9.21.0" }, @@ -127,16 +127,16 @@ }, "../resolver": { "name": "doc-detective-resolver", - "version": "3.6.1", + "version": "3.7.0-preview.0", "license": "AGPL-3.0-only", "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", "axios": "^1.13.2", - "doc-detective-common": "file:../common", + "doc-detective-common": "^3.7.0-preview.0", "dotenv": "^17.2.3", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.0" + "posthog-node": "^5.17.2" }, "devDependencies": { "body-parser": "^2.2.1", @@ -1141,19 +1141,20 @@ } }, "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.0", + "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", + "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", @@ -2318,9 +2319,9 @@ } }, "node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", + "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", "license": "MIT", "engines": { "node": ">=0.10.0" diff --git a/cli/package.json b/cli/package.json index cded37b..3df466b 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "doc-detective", - "version": "3.5.1", + "version": "3.7.0-preview.0", "description": "Treat doc content as testable assertions to validate doc accuracy and product UX.", "bin": { "doc-detective": "src/index.js" @@ -34,21 +34,21 @@ "dependencies": { "@ffmpeg-installer/ffmpeg": "^1.1.0", "axios": "^1.13.2", - "doc-detective-common": "file:../common", - "doc-detective-core": "file:../core", - "doc-detective-resolver": "file:../resolver", + "doc-detective-common": "^3.7.0-preview.0", + "doc-detective-core": "^3.7.0-preview.0", + "doc-detective-resolver": "^3.7.0-preview.0", "ink": "^6.5.1", "ink-select-input": "^6.2.0", "ink-spinner": "^5.0.0", "js-yaml": "^4.1.1", - "react": "^19.2.0", + "react": "^19.2.1", "yaml": "^2.8.2", "yargs": "^17.7.2" }, "devDependencies": { "body-parser": "^2.2.1", "chai": "^6.2.1", - "express": "^5.1.0", + "express": "^5.2.1", "ink-testing-library": "^4.0.0", "mocha": "^11.7.5", "sinon": "^19.0.2" From 3b7111e6521a523d010fda3eb29a4ccaf558ee04 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 11 Dec 2025 11:22:57 -0800 Subject: [PATCH 71/90] Add Ollama support --- common/dist/schemas/config_v3.schema.json | 13 + .../dist/schemas/resolvedTests_v3.schema.json | 13 + common/package-lock.json | 17 + common/package.json | 1 + common/src/ai.js | 65 ++- .../output_schemas/config_v3.schema.json | 13 + .../resolvedTests_v3.schema.json | 13 + common/src/schemas/schemas.json | 26 ++ .../schemas/src_schemas/config_v3.schema.json | 13 + common/test/ai.test.js | 408 ++++++++++++++---- 10 files changed, 484 insertions(+), 98 deletions(-) diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index 1e244a3..86a91bd 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -10418,6 +10418,19 @@ } }, "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" } }, "title": "Integrations options" diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index bc4fec1..4f9ed24 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -10431,6 +10431,19 @@ } }, "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" } }, "title": "Integrations options" diff --git a/common/package-lock.json b/common/package-lock.json index 2791ad9..594b7ce 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -18,6 +18,7 @@ "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", + "ollama-ai-provider-v2": "^1.2.0", "yaml": "^2.8.2", "zod": "^4.1.13" }, @@ -1211,6 +1212,22 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/ollama-ai-provider-v2": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/ollama-ai-provider-v2/-/ollama-ai-provider-v2-1.5.5.tgz", + "integrity": "sha512-1YwTFdPjhPNHny/DrOHO+s8oVGGIE5Jib61/KnnjPRNWQhVVimrJJdaAX3e6nNRRDXrY5zbb9cfm2+yVvgsrqw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "^2.0.0", + "@ai-sdk/provider-utils": "^3.0.17" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^4.0.16" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", diff --git a/common/package.json b/common/package.json index 6c7680b..1b47668 100644 --- a/common/package.json +++ b/common/package.json @@ -27,6 +27,7 @@ "dependencies": { "@ai-sdk/anthropic": "^2.0.54", "@ai-sdk/openai": "^2.0.80", + "ollama-ai-provider-v2": "^1.2.0", "@apidevtools/json-schema-ref-parser": "^15.1.3", "ai": "^5.0.109", "ajv": "^8.17.1", diff --git a/common/src/ai.js b/common/src/ai.js index 927094a..0dc5dbe 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -1,11 +1,14 @@ const { generateText, generateObject, jsonSchema } = require("ai"); const { createOpenAI } = require("@ai-sdk/openai"); const { createAnthropic } = require("@ai-sdk/anthropic"); +const { createOllama } = require("ollama-ai-provider-v2"); const { z } = require("zod"); const Ajv = require("ajv"); const addFormats = require("ajv-formats"); -const DEFAULT_MODEL = "anthropic/claude-haiku-4.5"; +const DEFAULT_MODEL = "ollama/qwen3-vl:2b"; +const OLLAMA_AVAILABILITY_TIMEOUT_MS = 500; +const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434/api"; const MAX_SCHEMA_VALIDATION_RETRIES = 3; /** @@ -20,9 +23,46 @@ const modelMap = { "openai/gpt-5.1": "gpt-5.1", "openai/gpt-5-mini": "gpt-5-mini", "openai/gpt-5-nano": "gpt-5-nano", + // Ollama models + "ollama/qwen3-vl:2b": "qwen3-vl:2b", + "ollama/qwen3-vl": "qwen3-vl", }; -const getDefaultProvider = (config) => { +/** + * Checks if Ollama is available at localhost:11434. + * @param {string} [baseUrl] - Optional base URL override. + * @returns {Promise} True if Ollama is available. + */ +const isOllamaAvailable = async (baseUrl) => { + const url = baseUrl || "http://localhost:11434"; + try { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), OLLAMA_AVAILABILITY_TIMEOUT_MS); + + const response = await fetch(url, { + method: "GET", + signal: controller.signal, + }); + + clearTimeout(timeoutId); + return response.ok; + } catch { + return false; + } +}; + +const getDefaultProvider = async (config) => { + // Try Ollama first (local, no API key needed) + const ollamaBaseUrl = config.integrations?.ollama?.baseUrl; + if (await isOllamaAvailable(ollamaBaseUrl)) { + return { + provider: "ollama", + model: "qwen3-vl:2b", + apiKey: null, + baseURL: ollamaBaseUrl || DEFAULT_OLLAMA_BASE_URL, + }; + } + // Try to detect from environment variables if no model is provided if (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) { return { @@ -43,13 +83,19 @@ const getDefaultProvider = (config) => { /** * Detects the provider, model, and API from a model string and environment variables. + * @param {Object} config - The Doc Detective configuration object. * @param {string} model - The model identifier. - * @returns {{ provider: "openai" | "anthropic" | null, model: string | null, apiKey: string | null }} The detected provider, model, and API key. + * @returns {Promise<{ provider: "openai" | "anthropic" | "ollama" | null, model: string | null, apiKey: string | null, baseURL?: string }>} The detected provider, model, and API key. */ -const detectProvider = (config, model) => { +const detectProvider = async (config, model) => { const detectedModel = modelMap[model] || null; if (!detectedModel) return getDefaultProvider(config); + if (model.startsWith("ollama/")) { + const ollamaBaseUrl = config.integrations?.ollama?.baseUrl || DEFAULT_OLLAMA_BASE_URL; + return { provider: "ollama", model: detectedModel, apiKey: null, baseURL: ollamaBaseUrl }; + } + if (model.startsWith("anthropic/") && (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic)) { const apiKey = process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey; return { provider: "anthropic", model: detectedModel, apiKey }; @@ -66,12 +112,18 @@ const detectProvider = (config, model) => { /** * Creates a provider instance based on the provider name. * @param {Object} options - * @param {"openai" | "anthropic"} options.provider - The provider name. + * @param {"openai" | "anthropic" | "ollama"} options.provider - The provider name. * @param {string} [options.apiKey] - Optional API key override. * @param {string} [options.baseURL] - Optional base URL override. * @returns {Function} The provider factory function. */ const createProvider = ({ provider, apiKey, baseURL }) => { + if (provider === "ollama") { + const options = {}; + if (baseURL) options.baseURL = baseURL; + return createOllama(options); + } + if (provider === "openai") { const options = {}; if (apiKey) options.apiKey = apiKey; @@ -311,7 +363,7 @@ const generate = async ({ } // Determine provider, model, and API key - const detected = detectProvider(config, model); + const detected = await detectProvider(config, model); if (!detected.provider) { throw new Error( @@ -526,6 +578,7 @@ module.exports = { generate, detectProvider, getApiKey, + isOllamaAvailable, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index 1e244a3..86a91bd 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -10418,6 +10418,19 @@ } }, "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" } }, "title": "Integrations options" diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index bc4fec1..4f9ed24 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -10431,6 +10431,19 @@ } }, "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" } }, "title": "Integrations options" diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index 2e2a247..3a42eb4 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -10816,6 +10816,19 @@ } }, "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" } }, "title": "Integrations options" @@ -34965,6 +34978,19 @@ } }, "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" } }, "title": "Integrations options" diff --git a/common/src/schemas/src_schemas/config_v3.schema.json b/common/src/schemas/src_schemas/config_v3.schema.json index 00b836d..efac635 100644 --- a/common/src/schemas/src_schemas/config_v3.schema.json +++ b/common/src/schemas/src_schemas/config_v3.schema.json @@ -246,6 +246,19 @@ } }, "title": "OpenAI" + }, + "ollama": { + "type": "object", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "additionalProperties": false, + "properties": { + "baseUrl": { + "type": "string", + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" + } + }, + "title": "Ollama" } }, "title": "Integrations options" diff --git a/common/test/ai.test.js b/common/test/ai.test.js index a76e1ce..88b7fea 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -1,21 +1,219 @@ const { z } = require("zod"); +const { execSync, spawn } = require("child_process"); +const fs = require("fs"); + +const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes +const OLLAMA_STARTUP_TIMEOUT_MS = 30 * 1000; // 30 seconds + +/** + * Detects available GPU type. + * @returns {"nvidia" | "amd" | "none"} The GPU type. + */ +const detectGpuType = () => { + // Check for Nvidia GPU + try { + execSync("nvidia-smi", { stdio: "ignore" }); + return "nvidia"; + } catch { + // nvidia-smi not available or failed + } + + // Check for AMD GPU + try { + if (fs.existsSync("/dev/kfd") && fs.existsSync("/dev/dri")) { + return "amd"; + } + } catch { + // fs check failed + } + + return "none"; +}; + +/** + * Starts the Ollama Docker container with appropriate GPU support. + * @returns {Promise} + */ +const startOllamaContainer = async () => { + const gpuType = detectGpuType(); + console.log(` Detected GPU type: ${gpuType}`); + + let dockerArgs; + switch (gpuType) { + case "nvidia": + dockerArgs = [ + "run", "-d", + "--gpus=all", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama" + ]; + break; + case "amd": + dockerArgs = [ + "run", "-d", + "--device", "/dev/kfd", + "--device", "/dev/dri", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama:rocm" + ]; + break; + default: + dockerArgs = [ + "run", "-d", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama" + ]; + } + + console.log(` Starting Ollama container...`); + execSync(`docker ${dockerArgs.join(" ")}`, { stdio: "inherit" }); +}; + +/** + * Waits for Ollama to become available. + * @param {number} timeoutMs - Maximum time to wait. + * @returns {Promise} True if Ollama became available. + */ +const waitForOllama = async (timeoutMs = OLLAMA_STARTUP_TIMEOUT_MS) => { + const startTime = Date.now(); + + while (Date.now() - startTime < timeoutMs) { + try { + const response = await fetch("http://localhost:11434"); + if (response.ok) { + return true; + } + } catch { + // Not ready yet + } + await new Promise(resolve => setTimeout(resolve, 1000)); + } + + return false; +}; + +/** + * Pulls the qwen3-vl model with progress output. + * @returns {Promise} + */ +const pullOllamaModel = async () => { + console.log(` Pulling qwen3-vl:2b model (this may take up to 10 minutes on first run)...`); + + return new Promise((resolve, reject) => { + const pullProcess = spawn("docker", ["exec", "ollama", "ollama", "pull", "qwen3-vl:2b"], { + stdio: "inherit" + }); -(async () => { - const { expect } = await import("chai"); + const timeoutId = setTimeout(() => { + pullProcess.kill(); + reject(new Error("Model pull timed out after 10 minutes")); + }, MODEL_PULL_TIMEOUT_MS); + + pullProcess.on("close", (code) => { + clearTimeout(timeoutId); + if (code === 0) { + console.log(` Model qwen3-vl:2b is ready.`); + resolve(); + } else { + reject(new Error(`Model pull failed with exit code ${code}`)); + } + }); + + pullProcess.on("error", (err) => { + clearTimeout(timeoutId); + reject(err); + }); + }); +}; + +/** + * Stops and removes the Ollama container. + * @returns {Promise} + */ +const stopOllamaContainer = async () => { + try { + console.log(` Stopping Ollama container...`); + execSync("docker stop ollama", { stdio: "ignore" }); + } catch { + // Container may not be running + } + try { + execSync("docker rm ollama", { stdio: "ignore" }); + console.log(` Ollama container removed.`); + } catch { + // Container may not exist + } +}; + +// Track if we started the container +let weStartedOllama = false; + +// Import chai using dynamic import (needed for ESM) +let expect; + +// Import AI module functions +const { + generate, + detectProvider, + getApiKey, + isOllamaAvailable, + modelMap, + DEFAULT_MODEL, + MAX_SCHEMA_VALIDATION_RETRIES, +} = require("../src/ai"); + +/** + * Ensures Ollama is running, starting a Docker container if needed. + * @returns {Promise} True if Ollama is available. + */ +const ensureOllamaRunning = async () => { + if (await isOllamaAvailable()) { + console.log(" Ollama is already running."); + return true; + } + + console.log(" Ollama not detected, starting Docker container..."); + + // Clean up any existing container first + await stopOllamaContainer(); - // Import AI module functions - const { - generate, - detectProvider, - getApiKey, - modelMap, - DEFAULT_MODEL, - MAX_SCHEMA_VALIDATION_RETRIES, - } = require("../src/ai"); - - describe("AI Module", function () { - // Increase timeout for real API calls - this.timeout(60000); + await startOllamaContainer(); + weStartedOllama = true; + + const available = await waitForOllama(); + if (!available) { + throw new Error("Ollama container started but did not become available"); + } + + await pullOllamaModel(); + return true; +}; + +describe("AI Module", function () { + // Increase timeout for real API calls and container setup + this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); + + before(async function () { + // Dynamic import for chai ESM + const chai = await import("chai"); + expect = chai.expect; + + console.log(" Setting up Ollama for tests..."); + await ensureOllamaRunning(); + }); + + after(async function () { + if (weStartedOllama) { + console.log(" Cleaning up Ollama container..."); + await stopOllamaContainer(); + } + }); describe("modelMap", function () { it("should contain Anthropic model mappings", function () { @@ -29,6 +227,11 @@ const { z } = require("zod"); expect(modelMap["openai/gpt-5-mini"]).to.equal("gpt-5-mini"); expect(modelMap["openai/gpt-5-nano"]).to.equal("gpt-5-nano"); }); + + it("should contain Ollama model mappings", function () { + expect(modelMap["ollama/qwen3-vl:2b"]).to.equal("qwen3-vl:2b"); + expect(modelMap["ollama/qwen3-vl"]).to.equal("qwen3-vl"); + }); }); describe("detectProvider", function () { @@ -58,91 +261,98 @@ const { z } = require("zod"); } }); - it("should detect Anthropic provider and mapped model for known Anthropic models with config API key", function () { + it("should detect Ollama provider for known Ollama models", async function () { + const config = {}; + const result = await detectProvider(config, "ollama/qwen3-vl:2b"); + expect(result.provider).to.equal("ollama"); + expect(result.model).to.equal("qwen3-vl:2b"); + expect(result.apiKey).to.be.null; + expect(result.baseURL).to.equal("http://localhost:11434/api"); + }); + + it("should use custom baseUrl from config for Ollama", async function () { + const config = { integrations: { ollama: { baseUrl: "http://custom:11434/api" } } }; + const result = await detectProvider(config, "ollama/qwen3-vl:2b"); + expect(result.provider).to.equal("ollama"); + expect(result.baseURL).to.equal("http://custom:11434/api"); + }); + + it("should detect Anthropic provider and mapped model for known Anthropic models with config API key", async function () { const config = { integrations: { anthropic: { apiKey: "sk-ant-test" } } }; - expect(detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + expect(await detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-haiku-4-5", apiKey: "sk-ant-test", }); - expect(detectProvider(config, "anthropic/claude-sonnet-4.5")).to.deep.equal({ + expect(await detectProvider(config, "anthropic/claude-sonnet-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-sonnet-4-5", apiKey: "sk-ant-test", }); - expect(detectProvider(config, "anthropic/claude-opus-4.5")).to.deep.equal({ + expect(await detectProvider(config, "anthropic/claude-opus-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-opus-4-5", apiKey: "sk-ant-test", }); }); - it("should detect Anthropic provider with env API key", function () { + it("should detect Anthropic provider with env API key", async function () { process.env.ANTHROPIC_API_KEY = "sk-ant-env"; const config = {}; - expect(detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + expect(await detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ provider: "anthropic", model: "claude-haiku-4-5", apiKey: "sk-ant-env", }); }); - it("should detect OpenAI provider and mapped model for known OpenAI models with config API key", function () { + it("should detect OpenAI provider and mapped model for known OpenAI models with config API key", async function () { const config = { integrations: { openAi: { apiKey: "sk-openai-test" } } }; - expect(detectProvider(config, "openai/gpt-5.1")).to.deep.equal({ + expect(await detectProvider(config, "openai/gpt-5.1")).to.deep.equal({ provider: "openai", model: "gpt-5.1", apiKey: "sk-openai-test", }); - expect(detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ + expect(await detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ provider: "openai", model: "gpt-5-mini", apiKey: "sk-openai-test", }); - expect(detectProvider(config, "openai/gpt-5-nano")).to.deep.equal({ + expect(await detectProvider(config, "openai/gpt-5-nano")).to.deep.equal({ provider: "openai", model: "gpt-5-nano", apiKey: "sk-openai-test", }); }); - it("should detect OpenAI provider with env API key", function () { + it("should detect OpenAI provider with env API key", async function () { process.env.OPENAI_API_KEY = "sk-openai-env"; const config = {}; - expect(detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ + expect(await detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ provider: "openai", model: "gpt-5-mini", apiKey: "sk-openai-env", }); }); - it("should prefer env API key over config API key", function () { + it("should prefer env API key over config API key", async function () { process.env.ANTHROPIC_API_KEY = "sk-ant-env"; const config = { integrations: { anthropic: { apiKey: "sk-ant-config" } } }; - expect(detectProvider(config, "anthropic/claude-haiku-4.5").apiKey).to.equal("sk-ant-env"); - }); - - it("should fall back to default provider when model is not in modelMap", function () { - process.env.ANTHROPIC_API_KEY = "sk-ant-env"; - const config = {}; - const result = detectProvider(config, "unknown-model"); - expect(result.provider).to.equal("anthropic"); - expect(result.model).to.equal("claude-haiku-4-5"); - expect(result.apiKey).to.equal("sk-ant-env"); + expect((await detectProvider(config, "anthropic/claude-haiku-4.5")).apiKey).to.equal("sk-ant-env"); }); - it("should return null values when no API key is available and model is unknown", function () { + it("should fall back to Ollama as default provider when available", async function () { const config = {}; - expect(detectProvider(config, "unknown-model")).to.deep.equal({ - provider: null, - model: null, - apiKey: null, - }); + const result = await detectProvider(config, "unknown-model"); + // Ollama should be preferred when available + expect(result.provider).to.equal("ollama"); + expect(result.model).to.equal("qwen3-vl:2b"); }); - it("should return null values when model is known but no API key for that provider", function () { + it("should return null values when model is known but no API key for that provider", async function () { const config = {}; - expect(detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ + // For Anthropic model without API key + expect(await detectProvider(config, "anthropic/claude-haiku-4.5")).to.deep.equal({ provider: null, model: null, }); @@ -150,8 +360,8 @@ const { z } = require("zod"); }); describe("DEFAULT_MODEL", function () { - it("should be anthropic/claude-haiku-4.5", function () { - expect(DEFAULT_MODEL).to.equal("anthropic/claude-haiku-4.5"); + it("should be ollama/qwen3-vl:2b", function () { + expect(DEFAULT_MODEL).to.equal("ollama/qwen3-vl:2b"); }); }); @@ -181,19 +391,22 @@ const { z } = require("zod"); } }); - it("should throw error when provider cannot be determined", async function () { - // Save and clear env vars to ensure no fallback provider + it("should throw error when provider cannot be determined and Ollama not available", async function () { + // This test verifies error handling when no provider is available + // Since Ollama is running, we need to test with an explicit model that + // requires an API key that isn't configured const originalAnthropicKey = process.env.ANTHROPIC_API_KEY; const originalOpenAIKey = process.env.OPENAI_API_KEY; delete process.env.ANTHROPIC_API_KEY; delete process.env.OPENAI_API_KEY; try { - await generate({ prompt: "Hello", model: "unknown-model", config: {} }); + // Use an Anthropic model explicitly without API key configured + await generate({ prompt: "Hello", model: "anthropic/claude-haiku-4.5", config: {} }); expect.fail("Should have thrown an error"); } catch (error) { expect(error.message).to.include("Cannot determine provider"); - expect(error.message).to.include("unknown-model"); + expect(error.message).to.include("anthropic/claude-haiku-4.5"); } finally { // Restore env vars if (originalAnthropicKey !== undefined) { @@ -207,9 +420,9 @@ const { z } = require("zod"); }); describe("text generation", function () { - it("should generate text with default model (Anthropic)", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + it("should generate text with default model (Ollama)", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -224,15 +437,15 @@ const { z } = require("zod"); expect(result.finishReason).to.be.a("string"); }); - it("should generate text with OpenAI model", async function () { - // Skip if no API key is set - if (!process.env.OPENAI_API_KEY) { + it("should generate text with explicit Ollama model", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } const result = await generate({ prompt: "Say exactly: Hello World", - model: "openai/gpt-4o-mini", + model: "ollama/qwen3-vl:2b", maxTokens: 50, }); @@ -242,26 +455,27 @@ const { z } = require("zod"); expect(result.finishReason).to.be.a("string"); }); - it("should generate text with explicit provider override", async function () { + it("should generate text with OpenAI model", async function () { // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + if (!process.env.OPENAI_API_KEY) { this.skip(); } const result = await generate({ - prompt: "Say exactly: Test", - model: "anthropic/claude-haiku-4.5", - provider: "anthropic", + prompt: "Say exactly: Hello World", + model: "openai/gpt-4o-mini", maxTokens: 50, }); expect(result.text).to.be.a("string"); expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); }); it("should include system message in generation", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -294,8 +508,8 @@ const { z } = require("zod"); }; it("should generate valid structured output with Zod schema", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -315,8 +529,8 @@ const { z } = require("zod"); }); it("should generate valid structured output with JSON schema", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -336,8 +550,8 @@ const { z } = require("zod"); }); it("should validate generated object against Zod schema", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -360,8 +574,8 @@ const { z } = require("zod"); }); it("should validate generated object against JSON schema", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -391,31 +605,42 @@ const { z } = require("zod"); describe("multimodal input with files", function () { it("should handle image URL input", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } - const result = await generate({ - prompt: "What colors do you see in this image? Be brief.", - files: [ - { - type: "image", - data: "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png", - }, - ], - maxTokens: 100, - }); + // Note: Some Ollama models may have issues with remote URLs. + // This test validates the multimodal input construction. + try { + const result = await generate({ + prompt: "What colors do you see in this image? Be brief.", + files: [ + { + type: "image", + data: "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png", + }, + ], + maxTokens: 100, + }); - expect(result.text).to.be.a("string"); - expect(result.text.length).to.be.greaterThan(0); + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + } catch (error) { + // Some Ollama models may not support remote URLs well + // Skip if we get a Bad Request error related to image handling + if (error.message && error.message.includes("Bad Request")) { + this.skip(); + } + throw error; + } }); }); describe("messages array support", function () { it("should handle multi-turn conversation", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -448,5 +673,4 @@ const { z } = require("zod"); }); }); }); - }); -})(); +}); From 1163430d702aef5c62e1f19ba31a44b626b62f78 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 11 Dec 2025 12:48:15 -0800 Subject: [PATCH 72/90] Extend media support in `generate()` --- common/src/ai.js | 23 +++++-- common/test/ai.test.js | 143 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+), 6 deletions(-) diff --git a/common/src/ai.js b/common/src/ai.js index 0dc5dbe..f5649ba 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -145,7 +145,7 @@ const createProvider = ({ provider, apiKey, baseURL }) => { * Converts a file object to AI SDK image part format. * @param {Object} file - The file object. * @param {string} file.type - The file type (e.g., "image"). - * @param {string} file.data - Base64 data or URL. + * @param {string | Buffer | Uint8Array} file.data - Base64 string, URL, Buffer, or Uint8Array. * @param {string} [file.mimeType] - The MIME type (e.g., "image/png"). * @returns {Object} The AI SDK image part. */ @@ -156,18 +156,29 @@ const fileToImagePart = (file) => { ); } - // Check if data is a URL - const isUrl = - file.data.startsWith("http://") || file.data.startsWith("https://"); + // Check if data is binary (Buffer or Uint8Array) - convert to base64 + // Note: The Ollama provider expects base64 strings, not raw binary + if (Buffer.isBuffer(file.data) || file.data instanceof Uint8Array) { + const base64Data = Buffer.isBuffer(file.data) + ? file.data.toString("base64") + : Buffer.from(file.data).toString("base64"); + return { + type: "image", + image: base64Data, + mimeType: file.mimeType, + }; + } - if (isUrl) { + // Check if data is a URL string + if (typeof file.data === "string" && + (file.data.startsWith("http://") || file.data.startsWith("https://"))) { return { type: "image", image: new URL(file.data), }; } - // Base64 data + // Base64 string data return { type: "image", image: file.data, diff --git a/common/test/ai.test.js b/common/test/ai.test.js index 88b7fea..76d3b79 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -604,6 +604,9 @@ describe("AI Module", function () { }); describe("multimodal input with files", function () { + // 100x100 grid PNG with red, blue, and green squares + const GRID_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABvUlEQVR4nO3YUW7DQAwD0b3/pZ0jhEjW2rE5LfT3ANGlE0Bda63LQc26kh/dmMMHbHP4gG0OH7DN4QO2OXzANocP2ObwAdscPmCbyy7Ia/McuICfMllzdxSy+c16i7MQmLMQmLMQmLMQmLMQmLMQmLMQmLMQmPNSh42fEJizEJizEJizEJizEJizEJizEJizEJizEJg7fpk6v1zqujGHD9jm8AHbHD5gm8MHbHP4gG0OH7DN4QO2OXzANnf8Mv0yu/9rc/p5Hn+p7y/kzHO85ivLQqYWh85CphaHzkKmFofOQqYWh85CphaHzkKmFofOQqYWh66wEPbsLwQ+9Dem8BNyaHHoLGRqcegsZGpx6CxkanHoLGRqcegsZGpx6CxkanHoLGRqcegKC3FQg39j2hw+YJvDB2xz+IBtDh+wzeEDtjl8wDaHD9jm8AHb3PHLlDm7f73U/3Q3FBLmg/9hLOTPB3mLsxCYsxCYsxCYsxCYsxCYsxCYO1mI46XOd35lwZyFwJyFwJyFwJyFwJyFwJyFwJyFwNzJQhzUwN/UPocP2ObwAdscPmCbwwdsc/iAbQ4fsM3hA7Y5fMAq9wGhbdAbu3rjOQAAAABJRU5ErkJggg=="; + it("should handle image URL input", async function () { // Skip if Ollama is not available if (!(await isOllamaAvailable())) { @@ -635,6 +638,146 @@ describe("AI Module", function () { throw error; } }); + + it("should handle base64 image data", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + try { + const result = await generate({ + prompt: "Describe what you see in this image. Be brief.", + files: [ + { + type: "image", + data: GRID_PNG_BASE64, + mimeType: "image/png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + } catch (error) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + this.skip(); + } + throw error; + } + }); + + it("should handle Buffer image data", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + // Convert base64 to Buffer + const imageBuffer = Buffer.from(GRID_PNG_BASE64, "base64"); + + try { + const result = await generate({ + prompt: "Describe what you see in this image. Be brief.", + files: [ + { + type: "image", + data: imageBuffer, + mimeType: "image/png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + } catch (error) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + this.skip(); + } + throw error; + } + }); + + it("should handle Uint8Array image data", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + // Convert base64 to Uint8Array + const buffer = Buffer.from(GRID_PNG_BASE64, "base64"); + const uint8Array = new Uint8Array(buffer); + + try { + const result = await generate({ + prompt: "Describe what you see in this image. Be brief.", + files: [ + { + type: "image", + data: uint8Array, + mimeType: "image/png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + } catch (error) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + this.skip(); + } + throw error; + } + }); + + it("should handle multiple images with mixed data types", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { + this.skip(); + } + + const imageBuffer = Buffer.from(GRID_PNG_BASE64, "base64"); + + try { + const result = await generate({ + prompt: "Describe what you see in these images. Be brief.", + files: [ + { + type: "image", + data: GRID_PNG_BASE64, + mimeType: "image/png", + }, + { + type: "image", + data: imageBuffer, + mimeType: "image/png", + }, + ], + maxTokens: 100, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + } catch (error) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + this.skip(); + } + throw error; + } + }); }); describe("messages array support", function () { From 44145a25fcb13a673f83cbd1d10c568105e2c1cf Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 11 Dec 2025 16:15:44 -0800 Subject: [PATCH 73/90] Add screenshot support --- cli/src/cli/builder/DebugRunner.mjs | 32 +++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/cli/src/cli/builder/DebugRunner.mjs b/cli/src/cli/builder/DebugRunner.mjs index d1e9130..1216af0 100644 --- a/cli/src/cli/builder/DebugRunner.mjs +++ b/cli/src/cli/builder/DebugRunner.mjs @@ -9,6 +9,9 @@ import { Box, Text, useInput, useApp } from 'ink'; import SelectInput from 'ink-select-input'; import { createRequire } from 'module'; const require = createRequire(import.meta.url); +const os = await import('os'); +const path = await import('path'); +const fs = await import('fs'); import StepEditor from './StepEditor.mjs'; import { StatusBar, JsonPreview, ConfirmPrompt } from './components.mjs'; @@ -223,10 +226,11 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { try { // Get previous steps for context const previousSteps = (localTest.steps || []).slice(0, currentStepIndex); - + const detectedProvider = await detectProvider(); + // Try to get the current browser DOM for context let dom = null; - if (runner) { + if (runner && detectedProvider.provider !== 'ollama') { try { dom = await runner.getPageSource(); } catch (domError) { @@ -234,12 +238,36 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { } } + // Capture a screenshot of the current browser viewport for AI analysis + let files = []; + if (runner && detectedProvider.provider !== 'ollama') { + try { + const tempPath = path.default.join(os.default.tmpdir(), `dd-debug-screenshot-${Date.now()}.png`); + const screenshotBuffer = await runner.saveScreenshot(tempPath); + const screenshotBase64 = screenshotBuffer.toString('base64'); + files.push({ + type: 'image', + data: screenshotBase64, + mimeType: 'image/png', + }); + // Clean up temp file + try { + fs.default.unlinkSync(tempPath); + } catch (cleanupError) { + // Ignore cleanup errors + } + } catch (screenshotError) { + // Ignore screenshot errors - browser might not have a page loaded + } + } + const refined = await refineStep({ step, failureMessage, previousSteps, context: dom ? { dom } : undefined, config: {}, // Uses env vars for API keys + files: files.length > 0 ? files : undefined, }); setAiRefinedStep(refined); From c2ce3a73ce6e90ae4b486e0602e1ac3849fd2913 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 11 Dec 2025 16:16:00 -0800 Subject: [PATCH 74/90] Refactor ollama support --- common/src/ai.js | 22 ++-- common/src/index.js | 23 +++- common/src/ollama.js | 198 +++++++++++++++++++++++++++++++++ common/test/ai.test.js | 185 ++---------------------------- common/test/refineStep.test.js | 54 +++++---- 5 files changed, 270 insertions(+), 212 deletions(-) create mode 100644 common/src/ollama.js diff --git a/common/src/ai.js b/common/src/ai.js index f5649ba..2441bbc 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -51,18 +51,8 @@ const isOllamaAvailable = async (baseUrl) => { } }; -const getDefaultProvider = async (config) => { - // Try Ollama first (local, no API key needed) - const ollamaBaseUrl = config.integrations?.ollama?.baseUrl; - if (await isOllamaAvailable(ollamaBaseUrl)) { - return { - provider: "ollama", - model: "qwen3-vl:2b", - apiKey: null, - baseURL: ollamaBaseUrl || DEFAULT_OLLAMA_BASE_URL, - }; - } - +const getDefaultProvider = async (config = {}) => { + const ollamaBaseUrl = config?.integrations?.ollama?.baseUrl; // Try to detect from environment variables if no model is provided if (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) { return { @@ -76,6 +66,14 @@ const getDefaultProvider = async (config) => { model: "gpt-5-mini", apiKey: process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey, }; + } else if (await isOllamaAvailable(ollamaBaseUrl)) { + // Local, no API key needed + return { + provider: "ollama", + model: "qwen3-vl:2b", + apiKey: null, + baseURL: ollamaBaseUrl || DEFAULT_OLLAMA_BASE_URL, + }; } else { return { provider: null, model: null, apiKey: null }; } diff --git a/common/src/index.js b/common/src/index.js index eb1a8e7..eab5c17 100644 --- a/common/src/index.js +++ b/common/src/index.js @@ -2,8 +2,19 @@ const { schemas } = require("./schemas"); const { validate, transformToSchemaKey } = require("./validate"); const { resolvePaths } = require("./resolvePaths"); const { readFile } = require("./files"); -const { generate, detectProvider, getApiKey, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); +const { generate, detectProvider, getApiKey, isOllamaAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); const { refineStep } = require("./refineStep"); +const { + DEFAULT_OLLAMA_MODEL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + detectGpuType, + startOllamaContainer, + waitForOllama, + pullOllamaModel, + stopOllamaContainer, + ensureOllamaRunning, +} = require("./ollama"); module.exports = { schemas, @@ -14,7 +25,17 @@ module.exports = { generate, detectProvider, getApiKey, + isOllamaAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, refineStep, + DEFAULT_OLLAMA_MODEL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + detectGpuType, + startOllamaContainer, + waitForOllama, + pullOllamaModel, + stopOllamaContainer, + ensureOllamaRunning, }; diff --git a/common/src/ollama.js b/common/src/ollama.js new file mode 100644 index 0000000..d8f866c --- /dev/null +++ b/common/src/ollama.js @@ -0,0 +1,198 @@ +const { execSync, spawn } = require("child_process"); +const fs = require("fs"); +const { isOllamaAvailable } = require("./ai"); + +/** Default Ollama model to use */ +const DEFAULT_OLLAMA_MODEL = "qwen3-vl:2b"; + +/** Maximum time to wait for model pull (10 minutes) */ +const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; + +/** Maximum time to wait for Ollama startup (30 seconds) */ +const OLLAMA_STARTUP_TIMEOUT_MS = 30 * 1000; + +/** + * Detects available GPU type. + * @returns {"nvidia" | "amd" | "none"} The GPU type. + */ +const detectGpuType = () => { + // Check for Nvidia GPU + try { + execSync("nvidia-smi", { stdio: "ignore" }); + return "nvidia"; + } catch { + // nvidia-smi not available or failed + } + + // Check for AMD GPU + try { + if (fs.existsSync("/dev/kfd") && fs.existsSync("/dev/dri")) { + return "amd"; + } + } catch { + // fs check failed + } + + return "none"; +}; + +/** + * Starts the Ollama Docker container with appropriate GPU support. + * @returns {Promise} + */ +const startOllamaContainer = async () => { + const gpuType = detectGpuType(); + console.log(` Detected GPU type: ${gpuType}`); + + let dockerArgs; + switch (gpuType) { + case "nvidia": + dockerArgs = [ + "run", "-d", + "--gpus=all", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama" + ]; + break; + case "amd": + dockerArgs = [ + "run", "-d", + "--device", "/dev/kfd", + "--device", "/dev/dri", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama:rocm" + ]; + break; + default: + dockerArgs = [ + "run", "-d", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama" + ]; + } + + console.log(` Starting Ollama container...`); + execSync(`docker ${dockerArgs.join(" ")}`, { stdio: "inherit" }); +}; + +/** + * Waits for Ollama to become available. + * @param {number} [timeoutMs=OLLAMA_STARTUP_TIMEOUT_MS] - Maximum time to wait. + * @returns {Promise} True if Ollama became available. + */ +const waitForOllama = async (timeoutMs = OLLAMA_STARTUP_TIMEOUT_MS) => { + const startTime = Date.now(); + + while (Date.now() - startTime < timeoutMs) { + try { + const response = await fetch("http://localhost:11434"); + if (response.ok) { + return true; + } + } catch { + // Not ready yet + } + await new Promise(resolve => setTimeout(resolve, 1000)); + } + + return false; +}; + +/** + * Pulls the specified Ollama model with progress output. + * @param {string} [model=DEFAULT_OLLAMA_MODEL] - The model to pull. + * @returns {Promise} + */ +const pullOllamaModel = async (model = DEFAULT_OLLAMA_MODEL) => { + console.log(` Pulling ${model} model (this may take up to 10 minutes on first run)...`); + + return new Promise((resolve, reject) => { + const pullProcess = spawn("docker", ["exec", "ollama", "ollama", "pull", model], { + stdio: "inherit" + }); + + const timeoutId = setTimeout(() => { + pullProcess.kill(); + reject(new Error("Model pull timed out after 10 minutes")); + }, MODEL_PULL_TIMEOUT_MS); + + pullProcess.on("close", (code) => { + clearTimeout(timeoutId); + if (code === 0) { + console.log(` Model ${model} is ready.`); + resolve(); + } else { + reject(new Error(`Model pull failed with exit code ${code}`)); + } + }); + + pullProcess.on("error", (err) => { + clearTimeout(timeoutId); + reject(err); + }); + }); +}; + +/** + * Stops and removes the Ollama container. + * @returns {Promise} + */ +const stopOllamaContainer = async () => { + try { + console.log(` Stopping Ollama container...`); + execSync("docker stop ollama", { stdio: "ignore" }); + } catch { + // Container may not be running + } + try { + execSync("docker rm ollama", { stdio: "ignore" }); + console.log(` Ollama container removed.`); + } catch { + // Container may not exist + } +}; + +/** + * Ensures Ollama is running, starting a Docker container if needed. + * @param {string} [model=DEFAULT_OLLAMA_MODEL] - The model to ensure is available. + * @returns {Promise} True if Ollama is available. + */ +const ensureOllamaRunning = async (model = DEFAULT_OLLAMA_MODEL) => { + if (await isOllamaAvailable()) { + console.log(" Ollama is already running."); + return true; + } + + console.log(" Ollama not detected, starting Docker container..."); + + // Clean up any existing container first + await stopOllamaContainer(); + + await startOllamaContainer(); + + const available = await waitForOllama(); + if (!available) { + throw new Error("Ollama container started but did not become available"); + } + + await pullOllamaModel(model); + return true; +}; + +module.exports = { + DEFAULT_OLLAMA_MODEL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + detectGpuType, + startOllamaContainer, + waitForOllama, + pullOllamaModel, + stopOllamaContainer, + ensureOllamaRunning, +}; diff --git a/common/test/ai.test.js b/common/test/ai.test.js index 76d3b79..8f1c7ff 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -1,155 +1,10 @@ const { z } = require("zod"); -const { execSync, spawn } = require("child_process"); -const fs = require("fs"); - -const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes -const OLLAMA_STARTUP_TIMEOUT_MS = 30 * 1000; // 30 seconds - -/** - * Detects available GPU type. - * @returns {"nvidia" | "amd" | "none"} The GPU type. - */ -const detectGpuType = () => { - // Check for Nvidia GPU - try { - execSync("nvidia-smi", { stdio: "ignore" }); - return "nvidia"; - } catch { - // nvidia-smi not available or failed - } - - // Check for AMD GPU - try { - if (fs.existsSync("/dev/kfd") && fs.existsSync("/dev/dri")) { - return "amd"; - } - } catch { - // fs check failed - } - - return "none"; -}; - -/** - * Starts the Ollama Docker container with appropriate GPU support. - * @returns {Promise} - */ -const startOllamaContainer = async () => { - const gpuType = detectGpuType(); - console.log(` Detected GPU type: ${gpuType}`); - - let dockerArgs; - switch (gpuType) { - case "nvidia": - dockerArgs = [ - "run", "-d", - "--gpus=all", - "-v", "ollama:/root/.ollama", - "-p", "11434:11434", - "--name", "ollama", - "ollama/ollama" - ]; - break; - case "amd": - dockerArgs = [ - "run", "-d", - "--device", "/dev/kfd", - "--device", "/dev/dri", - "-v", "ollama:/root/.ollama", - "-p", "11434:11434", - "--name", "ollama", - "ollama/ollama:rocm" - ]; - break; - default: - dockerArgs = [ - "run", "-d", - "-v", "ollama:/root/.ollama", - "-p", "11434:11434", - "--name", "ollama", - "ollama/ollama" - ]; - } - - console.log(` Starting Ollama container...`); - execSync(`docker ${dockerArgs.join(" ")}`, { stdio: "inherit" }); -}; - -/** - * Waits for Ollama to become available. - * @param {number} timeoutMs - Maximum time to wait. - * @returns {Promise} True if Ollama became available. - */ -const waitForOllama = async (timeoutMs = OLLAMA_STARTUP_TIMEOUT_MS) => { - const startTime = Date.now(); - - while (Date.now() - startTime < timeoutMs) { - try { - const response = await fetch("http://localhost:11434"); - if (response.ok) { - return true; - } - } catch { - // Not ready yet - } - await new Promise(resolve => setTimeout(resolve, 1000)); - } - - return false; -}; - -/** - * Pulls the qwen3-vl model with progress output. - * @returns {Promise} - */ -const pullOllamaModel = async () => { - console.log(` Pulling qwen3-vl:2b model (this may take up to 10 minutes on first run)...`); - - return new Promise((resolve, reject) => { - const pullProcess = spawn("docker", ["exec", "ollama", "ollama", "pull", "qwen3-vl:2b"], { - stdio: "inherit" - }); - - const timeoutId = setTimeout(() => { - pullProcess.kill(); - reject(new Error("Model pull timed out after 10 minutes")); - }, MODEL_PULL_TIMEOUT_MS); - - pullProcess.on("close", (code) => { - clearTimeout(timeoutId); - if (code === 0) { - console.log(` Model qwen3-vl:2b is ready.`); - resolve(); - } else { - reject(new Error(`Model pull failed with exit code ${code}`)); - } - }); - pullProcess.on("error", (err) => { - clearTimeout(timeoutId); - reject(err); - }); - }); -}; - -/** - * Stops and removes the Ollama container. - * @returns {Promise} - */ -const stopOllamaContainer = async () => { - try { - console.log(` Stopping Ollama container...`); - execSync("docker stop ollama", { stdio: "ignore" }); - } catch { - // Container may not be running - } - try { - execSync("docker rm ollama", { stdio: "ignore" }); - console.log(` Ollama container removed.`); - } catch { - // Container may not exist - } -}; +const { + ensureOllamaRunning, + stopOllamaContainer, + MODEL_PULL_TIMEOUT_MS, +} = require("../src/ollama"); // Track if we started the container let weStartedOllama = false; @@ -168,33 +23,6 @@ const { MAX_SCHEMA_VALIDATION_RETRIES, } = require("../src/ai"); -/** - * Ensures Ollama is running, starting a Docker container if needed. - * @returns {Promise} True if Ollama is available. - */ -const ensureOllamaRunning = async () => { - if (await isOllamaAvailable()) { - console.log(" Ollama is already running."); - return true; - } - - console.log(" Ollama not detected, starting Docker container..."); - - // Clean up any existing container first - await stopOllamaContainer(); - - await startOllamaContainer(); - weStartedOllama = true; - - const available = await waitForOllama(); - if (!available) { - throw new Error("Ollama container started but did not become available"); - } - - await pullOllamaModel(); - return true; -}; - describe("AI Module", function () { // Increase timeout for real API calls and container setup this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); @@ -205,7 +33,10 @@ describe("AI Module", function () { expect = chai.expect; console.log(" Setting up Ollama for tests..."); + // Track if we need to start the container + const wasAlreadyRunning = await isOllamaAvailable(); await ensureOllamaRunning(); + weStartedOllama = !wasAlreadyRunning; }); after(async function () { diff --git a/common/test/refineStep.test.js b/common/test/refineStep.test.js index e57b3b9..d349aa8 100644 --- a/common/test/refineStep.test.js +++ b/common/test/refineStep.test.js @@ -1,18 +1,29 @@ -(async () => { - const { expect } = await import("chai"); - - // Import the refineStep module - const { - refineStep, - buildRefinementPrompt, - truncateContent, - REFINE_STEP_SYSTEM_PROMPT, - DEFAULT_MAX_CONTEXT_LENGTH, - } = require("../src/refineStep"); - - describe("RefineStep Module", function () { - // Increase timeout for real API calls - this.timeout(120000); +// Import the refineStep module +const { + refineStep, + buildRefinementPrompt, + truncateContent, + REFINE_STEP_SYSTEM_PROMPT, + DEFAULT_MAX_CONTEXT_LENGTH, +} = require("../src/refineStep"); +const { isOllamaAvailable } = require("../src/ai"); +const { ensureOllamaRunning, MODEL_PULL_TIMEOUT_MS } = require("../src/ollama"); + +// Import chai using dynamic import (needed for ESM) +let expect; + +describe("RefineStep Module", function () { + // Increase timeout for real API calls and container setup + this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); + + before(async function () { + // Dynamic import for chai ESM + const chai = await import("chai"); + expect = chai.expect; + + console.log(" Setting up Ollama for tests..."); + await ensureOllamaRunning(); + }); describe("truncateContent", function () { it("should return content unchanged if within limit", function () { @@ -219,7 +230,7 @@ describe("step refinement", function () { it("should refine a step with failure context", async function () { // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -246,7 +257,7 @@ it("should preserve stepId from original step", async function () { // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -265,7 +276,7 @@ it("should preserve sourceLocation from original step", async function () { // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -295,7 +306,7 @@ it("should use model from config when provided", async function () { // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -332,7 +343,7 @@ it("should handle previous steps context", async function () { // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -359,7 +370,7 @@ describe("step validation", function () { it("should produce steps that pass schema validation", async function () { // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -379,4 +390,3 @@ }); }); }); -})(); From 24a83c3e9edb2ae6f9616be70502ad5bbe28d9b2 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 11 Dec 2025 18:20:02 -0800 Subject: [PATCH 75/90] Add Google as an AI provider --- common/dev/dev.js | 50 ++++++-- common/dist/schemas/config_v3.schema.json | 12 ++ .../dist/schemas/resolvedTests_v3.schema.json | 12 ++ common/package-lock.json | 60 +++++++++ common/package.json | 1 + common/src/ai.js | 36 +++++- common/src/ollama.js | 4 +- .../output_schemas/config_v3.schema.json | 12 ++ .../resolvedTests_v3.schema.json | 12 ++ common/src/schemas/schemas.json | 24 ++++ .../schemas/src_schemas/config_v3.schema.json | 12 ++ common/test/ai.test.js | 115 ++++++++++++++++-- 12 files changed, 327 insertions(+), 23 deletions(-) diff --git a/common/dev/dev.js b/common/dev/dev.js index 0ff7d6c..d9254df 100644 --- a/common/dev/dev.js +++ b/common/dev/dev.js @@ -1,13 +1,49 @@ const { validate, schemas, refineStep } = require("../src/index"); -const { detectProvider } = require("../src/ai"); +const { detectProvider, generate, modelMap } = require("../src/ai"); + +const testRefineStep = async (model) => { + const originalStep = { + stepId: "step-123", + find: { selector: ".old-button-class" }, + }; + + const startTime = performance.now(); + const refinedStep = await refineStep({ + step: originalStep, + failureMessage: "Element not found: .old-button-class", + context: { + dom: ` + + `, + }, + }); + const endTime = performance.now(); + const duration = endTime - startTime; + + console.log("Refined Step:", refinedStep); + return { model, duration }; +}; (async () => { + // get list of models from modelMap + const models = Object.keys(modelMap); + const results = []; -const providerInfo = detectProvider({ - integrations: { - openAi: { apiKey: "sk-..." }, + for (const model of models) { + console.log(`\n=== Testing refineStep with model: ${model} ===`); + const result = await testRefineStep(model); + results.push(result); } -}, "openai/gpt-5.1"); -console.log("Detected provider and model:", providerInfo); -})(); + // Print results summary + console.log("\n=== Refinement Duration Summary ==="); + results.forEach(({ model, duration }) => { + console.log(`${model}: ${duration.toFixed(2)}ms`); + }); + + // Print sorted by duration + console.log("\n=== Sorted by Duration (fastest first) ==="); + [...results].sort((a, b) => a.duration - b.duration).forEach(({ model, duration }) => { + console.log(`${model}: ${duration.toFixed(2)}ms`); + }); +})(); diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index 86a91bd..c187bfa 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -10431,6 +10431,18 @@ } }, "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index 4f9ed24..ba60461 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -10444,6 +10444,18 @@ } }, "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" diff --git a/common/package-lock.json b/common/package-lock.json index 594b7ce..8bf9649 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -10,6 +10,7 @@ "license": "AGPL-3.0-only", "dependencies": { "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/google": "^3.0.0-beta.72", "@ai-sdk/openai": "^2.0.80", "@apidevtools/json-schema-ref-parser": "^15.1.3", "ai": "^5.0.109", @@ -61,6 +62,65 @@ "zod": "^3.25.76 || ^4.1.8" } }, + "node_modules/@ai-sdk/google": { + "version": "3.0.0-beta.72", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-3.0.0-beta.72.tgz", + "integrity": "sha512-PIK3PGt3XUFaPxIAwrEx/dmcdzSA6cyGdUGUHMIDedi+ILMdfjGavtEjdYANM3Z5xnO+5Skx+2hcHyHdwIqkgQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.0-beta.26", + "@ai-sdk/provider-utils": "4.0.0-beta.47" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/google/node_modules/@ai-sdk/provider": { + "version": "3.0.0-beta.26", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.0-beta.26.tgz", + "integrity": "sha512-UQyOlrpahFL1CZ/QA0ZpFhAkE32fw1XXBx+6gu23YWSCMJCjaf/fiJUPV7xUhp/nXqVO/IC+PIIfLomx55D16A==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/google/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.0-beta.47.tgz", + "integrity": "sha512-nTR25V0+M/TGRegVXdhaCPqy6iaJfiyvhwtZ3ZDKhHmSVQXuwUb8zSXCPhEtpNgWXzWP3XNZvlzzgIHqByi6aw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.0-beta.26", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@valibot/to-json-schema": "^1.3.0", + "arktype": "^2.1.22", + "effect": "^3.18.4", + "zod": "^3.25.76 || ^4.1.8" + }, + "peerDependenciesMeta": { + "@valibot/to-json-schema": { + "optional": true + }, + "arktype": { + "optional": true + }, + "effect": { + "optional": true + } + } + }, "node_modules/@ai-sdk/openai": { "version": "2.0.80", "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.80.tgz", diff --git a/common/package.json b/common/package.json index 1b47668..bab8fed 100644 --- a/common/package.json +++ b/common/package.json @@ -26,6 +26,7 @@ }, "dependencies": { "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/google": "^3.0.0-beta.72", "@ai-sdk/openai": "^2.0.80", "ollama-ai-provider-v2": "^1.2.0", "@apidevtools/json-schema-ref-parser": "^15.1.3", diff --git a/common/src/ai.js b/common/src/ai.js index 2441bbc..493d806 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -1,6 +1,7 @@ const { generateText, generateObject, jsonSchema } = require("ai"); const { createOpenAI } = require("@ai-sdk/openai"); const { createAnthropic } = require("@ai-sdk/anthropic"); +const { createGoogleGenerativeAI } = require("@ai-sdk/google"); const { createOllama } = require("ollama-ai-provider-v2"); const { z } = require("zod"); const Ajv = require("ajv"); @@ -20,12 +21,16 @@ const modelMap = { "anthropic/claude-sonnet-4.5": "claude-sonnet-4-5", "anthropic/claude-opus-4.5": "claude-opus-4-5", // OpenAI models - "openai/gpt-5.1": "gpt-5.1", + "openai/gpt-5.2": "gpt-5.2", "openai/gpt-5-mini": "gpt-5-mini", "openai/gpt-5-nano": "gpt-5-nano", + // Google Gemini models + "google/gemini-2.5-flash": "gemini-2.5-flash", + "google/gemini-2.5-pro": "gemini-2.5-pro", + "google/gemini-3-pro": "gemini-3-pro-preview", // Ollama models - "ollama/qwen3-vl:2b": "qwen3-vl:2b", - "ollama/qwen3-vl": "qwen3-vl", + "ollama/qwen3-vl:8b": "hf.co/unsloth/Qwen3-VL-8B-Instruct-GGUF:UD-Q4_K_XL", + "ollama/qwen3-vl:2b": "hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M", }; /** @@ -66,6 +71,12 @@ const getDefaultProvider = async (config = {}) => { model: "gpt-5-mini", apiKey: process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey, }; + } else if (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations?.google) { + return { + provider: "google", + model: "gemini-2.5-flash", + apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google.apiKey, + }; } else if (await isOllamaAvailable(ollamaBaseUrl)) { // Local, no API key needed return { @@ -104,6 +115,11 @@ const detectProvider = async (config, model) => { return { provider: "openai", model: detectedModel, apiKey }; } + if (model.startsWith("google/") && (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations?.google)) { + const apiKey = process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google.apiKey; + return { provider: "google", model: detectedModel, apiKey }; + } + return { provider: null, model: null }; }; @@ -136,6 +152,13 @@ const createProvider = ({ provider, apiKey, baseURL }) => { return createAnthropic(options); } + if (provider === "google") { + const options = {}; + if (apiKey) options.apiKey = apiKey; + if (baseURL) options.baseURL = baseURL; + return createGoogleGenerativeAI(options); + } + throw new Error(`Unsupported provider: ${provider}`); }; @@ -318,6 +341,13 @@ const getApiKey = (config, provider) => { return process.env.OPENAI_API_KEY || config.integrations.openai.apiKey; } + if ( + provider === "google" && + (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google) + ) { + return process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google.apiKey; + } + return undefined; }; diff --git a/common/src/ollama.js b/common/src/ollama.js index d8f866c..42217aa 100644 --- a/common/src/ollama.js +++ b/common/src/ollama.js @@ -1,9 +1,9 @@ const { execSync, spawn } = require("child_process"); const fs = require("fs"); -const { isOllamaAvailable } = require("./ai"); +const { isOllamaAvailable, modelMap } = require("./ai"); /** Default Ollama model to use */ -const DEFAULT_OLLAMA_MODEL = "qwen3-vl:2b"; +const DEFAULT_OLLAMA_MODEL = modelMap["ollama/qwen3-vl:8b"]; /** Maximum time to wait for model pull (10 minutes) */ const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index 86a91bd..c187bfa 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -10431,6 +10431,18 @@ } }, "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index 4f9ed24..ba60461 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -10444,6 +10444,18 @@ } }, "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index 3a42eb4..c4d37af 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -10829,6 +10829,18 @@ } }, "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" @@ -34991,6 +35003,18 @@ } }, "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" diff --git a/common/src/schemas/src_schemas/config_v3.schema.json b/common/src/schemas/src_schemas/config_v3.schema.json index efac635..3858229 100644 --- a/common/src/schemas/src_schemas/config_v3.schema.json +++ b/common/src/schemas/src_schemas/config_v3.schema.json @@ -259,6 +259,18 @@ } }, "title": "Ollama" + }, + "google": { + "type": "object", + "description": "Configuration for Google Gemini AI integration.", + "additionalProperties": false, + "properties": { + "apiKey": { + "type": "string", + "description": "API key for authenticating with Google Generative AI." + } + }, + "title": "Google Gemini" } }, "title": "Integrations options" diff --git a/common/test/ai.test.js b/common/test/ai.test.js index 8f1c7ff..ddfb070 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -54,14 +54,20 @@ describe("AI Module", function () { }); it("should contain OpenAI model mappings", function () { - expect(modelMap["openai/gpt-5.1"]).to.equal("gpt-5.1"); + expect(modelMap["openai/gpt-5.2"]).to.equal("gpt-5.2"); expect(modelMap["openai/gpt-5-mini"]).to.equal("gpt-5-mini"); expect(modelMap["openai/gpt-5-nano"]).to.equal("gpt-5-nano"); }); it("should contain Ollama model mappings", function () { - expect(modelMap["ollama/qwen3-vl:2b"]).to.equal("qwen3-vl:2b"); - expect(modelMap["ollama/qwen3-vl"]).to.equal("qwen3-vl"); + expect(modelMap["ollama/qwen3-vl:2b"]).to.equal("hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); + expect(modelMap["ollama/qwen3-vl:8b"]).to.equal("hf.co/unsloth/Qwen3-VL-8B-Instruct-GGUF:UD-Q4_K_XL"); + }); + + it("should contain Google Gemini model mappings", function () { + expect(modelMap["google/gemini-2.5-flash"]).to.equal("gemini-2.5-flash"); + expect(modelMap["google/gemini-2.5-pro"]).to.equal("gemini-2.5-pro"); + expect(modelMap["google/gemini-3-pro"]).to.equal("gemini-3-pro-preview"); }); }); @@ -69,13 +75,16 @@ describe("AI Module", function () { // Store original env vars to restore after tests let originalAnthropicKey; let originalOpenAIKey; + let originalGoogleKey; beforeEach(function () { originalAnthropicKey = process.env.ANTHROPIC_API_KEY; originalOpenAIKey = process.env.OPENAI_API_KEY; + originalGoogleKey = process.env.GOOGLE_GENERATIVE_AI_API_KEY; // Clear env vars for predictable testing delete process.env.ANTHROPIC_API_KEY; delete process.env.OPENAI_API_KEY; + delete process.env.GOOGLE_GENERATIVE_AI_API_KEY; }); afterEach(function () { @@ -90,13 +99,18 @@ describe("AI Module", function () { } else { delete process.env.OPENAI_API_KEY; } + if (originalGoogleKey !== undefined) { + process.env.GOOGLE_GENERATIVE_AI_API_KEY = originalGoogleKey; + } else { + delete process.env.GOOGLE_GENERATIVE_AI_API_KEY; + } }); it("should detect Ollama provider for known Ollama models", async function () { const config = {}; const result = await detectProvider(config, "ollama/qwen3-vl:2b"); expect(result.provider).to.equal("ollama"); - expect(result.model).to.equal("qwen3-vl:2b"); + expect(result.model).to.equal("hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); expect(result.apiKey).to.be.null; expect(result.baseURL).to.equal("http://localhost:11434/api"); }); @@ -139,9 +153,9 @@ describe("AI Module", function () { it("should detect OpenAI provider and mapped model for known OpenAI models with config API key", async function () { const config = { integrations: { openAi: { apiKey: "sk-openai-test" } } }; - expect(await detectProvider(config, "openai/gpt-5.1")).to.deep.equal({ + expect(await detectProvider(config, "openai/gpt-5.2")).to.deep.equal({ provider: "openai", - model: "gpt-5.1", + model: "gpt-5.2", apiKey: "sk-openai-test", }); expect(await detectProvider(config, "openai/gpt-5-mini")).to.deep.equal({ @@ -166,6 +180,41 @@ describe("AI Module", function () { }); }); + it("should detect Google provider and mapped model for known Google models with config API key", async function () { + const config = { integrations: { google: { apiKey: "google-test-key" } } }; + expect(await detectProvider(config, "google/gemini-2.5-flash")).to.deep.equal({ + provider: "google", + model: "gemini-2.5-flash", + apiKey: "google-test-key", + }); + expect(await detectProvider(config, "google/gemini-2.5-pro")).to.deep.equal({ + provider: "google", + model: "gemini-2.5-pro", + apiKey: "google-test-key", + }); + expect(await detectProvider(config, "google/gemini-3-pro")).to.deep.equal({ + provider: "google", + model: "gemini-3-pro-preview", + apiKey: "google-test-key", + }); + }); + + it("should detect Google provider with env API key", async function () { + process.env.GOOGLE_GENERATIVE_AI_API_KEY = "google-env-key"; + const config = {}; + expect(await detectProvider(config, "google/gemini-2.5-flash")).to.deep.equal({ + provider: "google", + model: "gemini-2.5-flash", + apiKey: "google-env-key", + }); + }); + + it("should prefer env API key over config API key for Google", async function () { + process.env.GOOGLE_GENERATIVE_AI_API_KEY = "google-env-key"; + const config = { integrations: { google: { apiKey: "google-config-key" } } }; + expect((await detectProvider(config, "google/gemini-2.5-flash")).apiKey).to.equal("google-env-key"); + }); + it("should prefer env API key over config API key", async function () { process.env.ANTHROPIC_API_KEY = "sk-ant-env"; const config = { integrations: { anthropic: { apiKey: "sk-ant-config" } } }; @@ -274,9 +323,35 @@ describe("AI Module", function () { this.skip(); } + try { + const result = await generate({ + prompt: "Reply with exactly one word: Yes", + model: "ollama/qwen3-vl:2b", + maxTokens: 20, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + } catch (error) { + // Skip if we get an Internal Server Error (model may not be available) + if (error.message && error.message.includes("Internal Server Error")) { + this.skip(); + } + throw error; + } + }); + + it("should generate text with OpenAI model", async function () { + // Skip if no API key is set + if (!process.env.OPENAI_API_KEY) { + this.skip(); + } + const result = await generate({ prompt: "Say exactly: Hello World", - model: "ollama/qwen3-vl:2b", + model: "openai/gpt-4o-mini", maxTokens: 50, }); @@ -286,15 +361,33 @@ describe("AI Module", function () { expect(result.finishReason).to.be.a("string"); }); - it("should generate text with OpenAI model", async function () { + it("should generate text with Anthropic model (smoke test)", async function () { // Skip if no API key is set - if (!process.env.OPENAI_API_KEY) { + if (!process.env.ANTHROPIC_API_KEY) { this.skip(); } const result = await generate({ - prompt: "Say exactly: Hello World", - model: "openai/gpt-4o-mini", + prompt: "Say exactly: Hello from Anthropic", + model: "anthropic/claude-haiku-4.5", + maxTokens: 50, + }); + + expect(result.text).to.be.a("string"); + expect(result.text.length).to.be.greaterThan(0); + expect(result.usage).to.be.an("object"); + expect(result.finishReason).to.be.a("string"); + }); + + it("should generate text with Google Gemini model (smoke test)", async function () { + // Skip if no API key is set + if (!process.env.GOOGLE_GENERATIVE_AI_API_KEY) { + this.skip(); + } + + const result = await generate({ + prompt: "Say exactly: Hello from Google", + model: "google/gemini-2.5-flash", maxTokens: 50, }); From 3c336f531064ef61020426bd6deb1cddcaa795bf Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 11 Dec 2025 19:02:04 -0800 Subject: [PATCH 76/90] Fix default model mapping --- common/src/ai.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/ai.js b/common/src/ai.js index 493d806..17b6b13 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -81,7 +81,7 @@ const getDefaultProvider = async (config = {}) => { // Local, no API key needed return { provider: "ollama", - model: "qwen3-vl:2b", + model: modelMap["ollama/qwen3-vl:8b"], apiKey: null, baseURL: ollamaBaseUrl || DEFAULT_OLLAMA_BASE_URL, }; From 6ca40a42d1d68b590cab49f46e37786b85308d2b Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Thu, 11 Dec 2025 20:01:40 -0800 Subject: [PATCH 77/90] local llm changes --- common/.github/workflows/npm-test.yml | 12 +- common/dev/dev.js | 1 + common/dist/schemas/config_v3.schema.json | 15 +- .../dist/schemas/resolvedTests_v3.schema.json | 15 +- common/package-lock.json | 2180 ++++++++++++++++- common/package.json | 2 +- common/src/ai.js | 104 +- common/src/index.js | 42 +- common/src/localLlm.js | 341 +++ common/src/ollama.js | 198 -- .../output_schemas/config_v3.schema.json | 15 +- .../resolvedTests_v3.schema.json | 15 +- common/src/schemas/schemas.json | 30 +- .../schemas/src_schemas/config_v3.schema.json | 15 +- common/test/ai.test.js | 183 +- common/test/refineStep.test.js | 40 +- 16 files changed, 2750 insertions(+), 458 deletions(-) create mode 100644 common/src/localLlm.js delete mode 100644 common/src/ollama.js diff --git a/common/.github/workflows/npm-test.yml b/common/.github/workflows/npm-test.yml index 20fbb0d..8be22b8 100644 --- a/common/.github/workflows/npm-test.yml +++ b/common/.github/workflows/npm-test.yml @@ -16,7 +16,7 @@ on: jobs: test: - timeout-minutes: 5 + timeout-minutes: 30 runs-on: ${{ matrix.os }} strategy: matrix: @@ -36,6 +36,16 @@ jobs: cache: "npm" cache-dependency-path: package-lock.json node-version: ${{ matrix.node }} + + # Cache local LLM models for faster CI runs + - name: Cache local LLM models + uses: actions/cache@v4 + with: + path: ${{ runner.temp }}/doc-detective/models + key: llm-models-${{ runner.os }}-${{ hashFiles('package-lock.json') }} + restore-keys: | + llm-models-${{ runner.os }}- + - run: npm ci - run: npm run build # Automatically run tests because of the `postbuild` script in package.json diff --git a/common/dev/dev.js b/common/dev/dev.js index d9254df..1775999 100644 --- a/common/dev/dev.js +++ b/common/dev/dev.js @@ -11,6 +11,7 @@ const testRefineStep = async (model) => { const refinedStep = await refineStep({ step: originalStep, failureMessage: "Element not found: .old-button-class", + model: model, context: { dom: ` diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index c187bfa..bc4f48e 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -10419,18 +10419,21 @@ }, "title": "OpenAI" }, - "ollama": { + "localLlm": { "type": "object", - "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "baseUrl": { + "modelsDir": { "type": "string", - "description": "Base URL for the Ollama API.", - "default": "http://localhost:11434/api" + "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." + }, + "defaultModel": { + "type": "string", + "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." } }, - "title": "Ollama" + "title": "Local LLM" }, "google": { "type": "object", diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index ba60461..16c5515 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -10432,18 +10432,21 @@ }, "title": "OpenAI" }, - "ollama": { + "localLlm": { "type": "object", - "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "baseUrl": { + "modelsDir": { "type": "string", - "description": "Base URL for the Ollama API.", - "default": "http://localhost:11434/api" + "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." + }, + "defaultModel": { + "type": "string", + "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." } }, - "title": "Ollama" + "title": "Local LLM" }, "google": { "type": "object", diff --git a/common/package-lock.json b/common/package-lock.json index 8bf9649..f24b869 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -19,7 +19,7 @@ "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "ollama-ai-provider-v2": "^1.2.0", + "node-llama-cpp": "^3.9.0", "yaml": "^2.8.2", "zod": "^4.1.13" }, @@ -181,6 +181,15 @@ "@types/json-schema": "^7.0.15" } }, + "node_modules/@huggingface/jinja": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.3.tgz", + "integrity": "sha512-asqfZ4GQS0hD876Uw4qiUb7Tr/V5Q+JZuo2L+BtdrD4U40QU58nIRq3ZSgAzJgT874VLjhGVacaYfrdpXtEvtA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -284,6 +293,574 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, + "node_modules/@node-llama-cpp/linux-arm64": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-arm64/-/linux-arm64-3.14.5.tgz", + "integrity": "sha512-58IcWW7EOqc/66mYWXRsoMCy1MR3pTX/YaC0HYF9Rg5XeAPKhUP7NHrglbqgjO62CkcuFZaSEiX2AtG972GQYQ==", + "cpu": [ + "arm64", + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/linux-armv7l": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-armv7l/-/linux-armv7l-3.14.5.tgz", + "integrity": "sha512-mJWN0qWsn8y+r/34DC3XlSiXjjKs6wX1BTx0wwJ37fWefS/qfzuBJwQGqpfqe5xpfafib/RgQX44fsvE/9yb1w==", + "cpu": [ + "arm", + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/linux-x64": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64/-/linux-x64-3.14.5.tgz", + "integrity": "sha512-f6xCqlSqSxMP9Iwm3CpaTzFybbHrzpLkNzA18v21PwhMN8u4DP44euLoxe+BMbOpyzx4iMxU1AUsPsgcHD1Y4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/linux-x64-cuda": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-cuda/-/linux-x64-cuda-3.14.5.tgz", + "integrity": "sha512-yk0EGnAJ+m/paSaItigmxcqC8nNjZlkx9yZgQE51CsTip7tmnqqlj60pW1fWmhrjOJ9XnRlVVTP81fa9B+O1Hg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/linux-x64-cuda-ext": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-cuda-ext/-/linux-x64-cuda-ext-3.14.5.tgz", + "integrity": "sha512-AACXmXjqvAppoC6Z20UI7yeSZaFb6uP9x/2lzctVwlm42ef76SN6DNXaX1yzH7DTyzK5zYhoH4ycJUe+zOeGzw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/linux-x64-vulkan": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-vulkan/-/linux-x64-vulkan-3.14.5.tgz", + "integrity": "sha512-9wZG90CUyyO8EsqfDEh03/fK0ctbQFbKaAFa6Goh+jFLOtqPL+plLqAsW3jDFdLRF5+oAPTKt9/4Y7vHTajQbQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/mac-arm64-metal": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/mac-arm64-metal/-/mac-arm64-metal-3.14.5.tgz", + "integrity": "sha512-7pclj/nbQyx7gPVbyqkCn+ftlGcnw7YrewxBv1/BWWAMzBrMt2+qkjtUcUhwXH7mT5WN/+eWsszhIMXH3Uf6vQ==", + "cpu": [ + "arm64", + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/mac-x64": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/mac-x64/-/mac-x64-3.14.5.tgz", + "integrity": "sha512-iZBmLgPkLKiKS0lYAuqq8i85etGeQ9L+AjEJUhG5N6T/vCF4XSOkUTsEFMEX+iJLV3VxvY/C8R1e/UF7InUjUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/win-arm64": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-arm64/-/win-arm64-3.14.5.tgz", + "integrity": "sha512-WTZJeb2JZo/qPNHf++xA2YeMXB46G7G4WsKEnHVyCpAhhslHAhe/LPgSQfNfk9rYusbsRiy9QMxeGNSOowZMVQ==", + "cpu": [ + "arm64", + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/win-x64": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64/-/win-x64-3.14.5.tgz", + "integrity": "sha512-cEuhb1iLTodM+V8xc1mWKeWRYkX9tlnl0+9jUjwsv2kgnAjEob3WlTYsCXewvEe2ShSyk8AsLsBPZxv7IQaBsw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/win-x64-cuda": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-cuda/-/win-x64-cuda-3.14.5.tgz", + "integrity": "sha512-gwBMSzUteLD765Gq/hYQ4UC21vggR7oG+DU4zAg0Mt3i34PqKJC+tBop5jsTN5Hq8RaM9+nTNrVbF/x228TLvg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/win-x64-cuda-ext": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-cuda-ext/-/win-x64-cuda-ext-3.14.5.tgz", + "integrity": "sha512-kBHnUmodr+n8N+sKTh1c6aNNEmvXBWM5AtaLWIEfkCb00bVHNFeqYPmLuPNtMX3dIUtD9PHdA4Jsn0RJmNZJfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@node-llama-cpp/win-x64-vulkan": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-vulkan/-/win-x64-vulkan-3.14.5.tgz", + "integrity": "sha512-rY+vr5RaGSCWEe22WZMkhUu16o9zpeqTZO/nD5G27Y0bb+xBRDLmXbxYMp2dDQTfpkNWIZ0ia3PGWwl5yhYw7A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@octokit/app": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.2.tgz", + "integrity": "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==", + "license": "MIT", + "dependencies": { + "@octokit/auth-app": "^8.1.2", + "@octokit/auth-unauthenticated": "^7.0.3", + "@octokit/core": "^7.0.6", + "@octokit/oauth-app": "^8.0.3", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/types": "^16.0.0", + "@octokit/webhooks": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-app": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.1.2.tgz", + "integrity": "sha512-db8VO0PqXxfzI6GdjtgEFHY9tzqUql5xMFXYA12juq8TeTgPAuiiP3zid4h50lwlIP457p5+56PnJOgd2GGBuw==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^9.0.3", + "@octokit/auth-oauth-user": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "toad-cache": "^3.7.0", + "universal-github-app-jwt": "^2.2.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-app": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", + "integrity": "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^8.0.3", + "@octokit/auth-oauth-user": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-device": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", + "integrity": "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==", + "license": "MIT", + "dependencies": { + "@octokit/oauth-methods": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-user": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", + "integrity": "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^8.0.3", + "@octokit/oauth-methods": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-unauthenticated": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz", + "integrity": "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/core": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/endpoint": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/graphql": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "license": "MIT", + "dependencies": { + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-app": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.3.tgz", + "integrity": "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^9.0.2", + "@octokit/auth-oauth-user": "^6.0.1", + "@octokit/auth-unauthenticated": "^7.0.2", + "@octokit/core": "^7.0.5", + "@octokit/oauth-authorization-url": "^8.0.0", + "@octokit/oauth-methods": "^6.0.1", + "@types/aws-lambda": "^8.10.83", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-authorization-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz", + "integrity": "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-methods": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", + "integrity": "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==", + "license": "MIT", + "dependencies": { + "@octokit/oauth-authorization-url": "^8.0.0", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "license": "MIT" + }, + "node_modules/@octokit/openapi-webhooks-types": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.1.0.tgz", + "integrity": "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-graphql": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz", + "integrity": "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz", + "integrity": "sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=7" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": "^7.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "fast-content-type-parse": "^3.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request-error": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, + "node_modules/@octokit/webhooks": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-14.2.0.tgz", + "integrity": "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-webhooks-types": "12.1.0", + "@octokit/request-error": "^7.0.0", + "@octokit/webhooks-methods": "^6.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/webhooks-methods": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz", + "integrity": "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, "node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -304,6 +881,154 @@ "node": ">=14" } }, + "node_modules/@reflink/reflink": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink/-/reflink-0.1.19.tgz", + "integrity": "sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@reflink/reflink-darwin-arm64": "0.1.19", + "@reflink/reflink-darwin-x64": "0.1.19", + "@reflink/reflink-linux-arm64-gnu": "0.1.19", + "@reflink/reflink-linux-arm64-musl": "0.1.19", + "@reflink/reflink-linux-x64-gnu": "0.1.19", + "@reflink/reflink-linux-x64-musl": "0.1.19", + "@reflink/reflink-win32-arm64-msvc": "0.1.19", + "@reflink/reflink-win32-x64-msvc": "0.1.19" + } + }, + "node_modules/@reflink/reflink-darwin-arm64": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-darwin-arm64/-/reflink-darwin-arm64-0.1.19.tgz", + "integrity": "sha512-ruy44Lpepdk1FqDz38vExBY/PVUsjxZA+chd9wozjUH9JjuDT/HEaQYA6wYN9mf041l0yLVar6BCZuWABJvHSA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@reflink/reflink-darwin-x64": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-darwin-x64/-/reflink-darwin-x64-0.1.19.tgz", + "integrity": "sha512-By85MSWrMZa+c26TcnAy8SDk0sTUkYlNnwknSchkhHpGXOtjNDUOxJE9oByBnGbeuIE1PiQsxDG3Ud+IVV9yuA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@reflink/reflink-linux-arm64-gnu": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-arm64-gnu/-/reflink-linux-arm64-gnu-0.1.19.tgz", + "integrity": "sha512-7P+er8+rP9iNeN+bfmccM4hTAaLP6PQJPKWSA4iSk2bNvo6KU6RyPgYeHxXmzNKzPVRcypZQTpFgstHam6maVg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@reflink/reflink-linux-arm64-musl": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-arm64-musl/-/reflink-linux-arm64-musl-0.1.19.tgz", + "integrity": "sha512-37iO/Dp6m5DDaC2sf3zPtx/hl9FV3Xze4xoYidrxxS9bgP3S8ALroxRK6xBG/1TtfXKTvolvp+IjrUU6ujIGmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@reflink/reflink-linux-x64-gnu": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-x64-gnu/-/reflink-linux-x64-gnu-0.1.19.tgz", + "integrity": "sha512-jbI8jvuYCaA3MVUdu8vLoLAFqC+iNMpiSuLbxlAgg7x3K5bsS8nOpTRnkLF7vISJ+rVR8W+7ThXlXlUQ93ulkw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@reflink/reflink-linux-x64-musl": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-x64-musl/-/reflink-linux-x64-musl-0.1.19.tgz", + "integrity": "sha512-e9FBWDe+lv7QKAwtKOt6A2W/fyy/aEEfr0g6j/hWzvQcrzHCsz07BNQYlNOjTfeytrtLU7k449H1PI95jA4OjQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@reflink/reflink-win32-arm64-msvc": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-win32-arm64-msvc/-/reflink-win32-arm64-msvc-0.1.19.tgz", + "integrity": "sha512-09PxnVIQcd+UOn4WAW73WU6PXL7DwGS6wPlkMhMg2zlHHG65F3vHepOw06HFCq+N42qkaNAc8AKIabWvtk6cIQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@reflink/reflink-win32-x64-msvc": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@reflink/reflink-win32-x64-msvc/-/reflink-win32-x64-msvc-0.1.19.tgz", + "integrity": "sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -349,6 +1074,25 @@ "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", "license": "MIT" }, + "node_modules/@tinyhttp/content-disposition": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@tinyhttp/content-disposition/-/content-disposition-2.2.2.tgz", + "integrity": "sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.159", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.159.tgz", + "integrity": "sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg==", + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -433,11 +1177,22 @@ "ajv": "^8.8.2" } }, + "node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -446,7 +1201,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -457,12 +1211,41 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -487,6 +1270,18 @@ "dev": true, "license": "MIT" }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "license": "Apache-2.0" + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -503,6 +1298,15 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -542,6 +1346,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chmodrp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chmodrp/-/chmodrp-1.0.2.tgz", + "integrity": "sha512-TdngOlFV1FLTzU0o1w8MB6/BFywhtLC0SzRTGJU7T9lmdjlCWeMRt1iVo0Ki+ldwNk0BqNiKoc8xpLZEQ8mY1w==", + "license": "MIT" + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -558,11 +1368,61 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -573,11 +1433,36 @@ "node": ">=12" } }, + "node_modules/cmake-js": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.4.0.tgz", + "integrity": "sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==", + "license": "MIT", + "dependencies": { + "axios": "^1.6.5", + "debug": "^4", + "fs-extra": "^11.2.0", + "memory-stream": "^1.0.0", + "node-api-headers": "^1.1.0", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.5.4", + "tar": "^6.2.0", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "cmake-js": "bin/cmake-js" + }, + "engines": { + "node": ">= 14.15.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -588,8 +1473,16 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } }, "node_modules/combined-stream": { "version": "1.0.8", @@ -603,11 +1496,25 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -619,10 +1526,10 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -647,6 +1554,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -656,6 +1572,12 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -690,8 +1612,16 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/env-var": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/env-var/-/env-var-7.5.0.tgz", + "integrity": "sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/es-define-property": { "version": "1.0.1", @@ -742,12 +1672,17 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/eventsource-parser": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", @@ -757,6 +1692,22 @@ "node": ">=18.0.0" } }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -778,6 +1729,33 @@ ], "license": "BSD-3-Clause" }, + "node_modules/filename-reserved-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filenamify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-6.0.0.tgz", + "integrity": "sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==", + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^3.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -839,6 +1817,44 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -848,16 +1864,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -928,6 +1981,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -964,6 +2023,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -985,15 +2050,171 @@ "he": "bin/he" } }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/ipull": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/ipull/-/ipull-3.9.3.tgz", + "integrity": "sha512-ZMkxaopfwKHwmEuGDYx7giNBdLxbHbRCWcQVA1D2eqE4crUguupfxej6s7UqbidYEwT69dkyumYkY8DPHIxF9g==", + "license": "MIT", + "dependencies": { + "@tinyhttp/content-disposition": "^2.2.0", + "async-retry": "^1.3.3", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-spinners": "^2.9.2", + "commander": "^10.0.0", + "eventemitter3": "^5.0.1", + "filenamify": "^6.0.0", + "fs-extra": "^11.1.1", + "is-unicode-supported": "^2.0.0", + "lifecycle-utils": "^2.0.1", + "lodash.debounce": "^4.0.8", + "lowdb": "^7.0.1", + "pretty-bytes": "^6.1.0", + "pretty-ms": "^8.0.0", + "sleep-promise": "^9.1.0", + "slice-ansi": "^7.1.0", + "stdout-update": "^4.0.1", + "strip-ansi": "^7.1.0" + }, + "bin": { + "ipull": "dist/cli/cli.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/ido-pluto/ipull?sponsor=1" + }, + "optionalDependencies": { + "@reflink/reflink": "^0.1.16" + } + }, + "node_modules/ipull/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ipull/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ipull/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipull/node_modules/lifecycle-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lifecycle-utils/-/lifecycle-utils-2.1.0.tgz", + "integrity": "sha512-AnrXnE2/OF9PHCyFg0RSqsnQTzV991XaZA/buhFDoc58xU7rhSCDgCz/09Lqpsn4MpoPHt7TRAXV1kWZypFVsA==", + "license": "MIT" + }, + "node_modules/ipull/node_modules/parse-ms": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipull/node_modules/pretty-ms": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", + "license": "MIT", + "dependencies": { + "parse-ms": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipull/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1029,7 +2250,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/jackspeak": { @@ -1071,6 +2291,30 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lifecycle-utils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lifecycle-utils/-/lifecycle-utils-3.0.1.tgz", + "integrity": "sha512-Qt/Jl5dsNIsyCAZsHB6x3mbwHFn0HJbdmvF49sVX/bHgX2cW7+G+U+I67Zw+TPM1Sr21Gb2nfJMd2g6iUcI1EQ==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -1093,6 +2337,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lowdb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz", + "integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==", + "license": "MIT", + "dependencies": { + "steno": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -1109,6 +2368,15 @@ "node": ">= 0.4" } }, + "node_modules/memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "license": "MIT", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1130,6 +2398,18 @@ "node": ">= 0.6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -1146,6 +2426,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -1156,6 +2445,43 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha": { "version": "11.7.5", "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", @@ -1269,23 +2595,380 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/ollama-ai-provider-v2": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/ollama-ai-provider-v2/-/ollama-ai-provider-v2-1.5.5.tgz", - "integrity": "sha512-1YwTFdPjhPNHny/DrOHO+s8oVGGIE5Jib61/KnnjPRNWQhVVimrJJdaAX3e6nNRRDXrY5zbb9cfm2+yVvgsrqw==", - "license": "Apache-2.0", + "node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-api-headers": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.7.0.tgz", + "integrity": "sha512-uJMGdkhVwu9+I3UsVvI3KW6ICAy/yDfsu5Br9rSnTtY3WpoaComXvKloiV5wtx0Md2rn0B9n29Ys2WMNwWxj9A==", + "license": "MIT" + }, + "node_modules/node-llama-cpp": { + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/node-llama-cpp/-/node-llama-cpp-3.14.5.tgz", + "integrity": "sha512-Db+RFqFMJOOVWprUINq77LVe44FaiJ6JvNiq14r2+DZRgkgyxckSZa6DcZ5Xe5MC+hGA5aqOdnNxsrudUcs74Q==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@huggingface/jinja": "^0.5.3", + "async-retry": "^1.3.3", + "bytes": "^3.1.2", + "chalk": "^5.4.1", + "chmodrp": "^1.0.2", + "cmake-js": "^7.4.0", + "cross-spawn": "^7.0.6", + "env-var": "^7.5.0", + "filenamify": "^6.0.0", + "fs-extra": "^11.3.0", + "ignore": "^7.0.4", + "ipull": "^3.9.2", + "is-unicode-supported": "^2.1.0", + "lifecycle-utils": "^3.0.1", + "log-symbols": "^7.0.0", + "nanoid": "^5.1.5", + "node-addon-api": "^8.3.1", + "octokit": "^5.0.3", + "ora": "^8.2.0", + "pretty-ms": "^9.2.0", + "proper-lockfile": "^4.1.2", + "semver": "^7.7.1", + "simple-git": "^3.27.0", + "slice-ansi": "^7.1.0", + "stdout-update": "^4.0.1", + "strip-ansi": "^7.1.0", + "validate-npm-package-name": "^6.0.0", + "which": "^5.0.0", + "yargs": "^17.7.2" + }, + "bin": { + "nlc": "dist/cli/cli.js", + "node-llama-cpp": "dist/cli/cli.js" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/giladgd" + }, + "optionalDependencies": { + "@node-llama-cpp/linux-arm64": "3.14.5", + "@node-llama-cpp/linux-armv7l": "3.14.5", + "@node-llama-cpp/linux-x64": "3.14.5", + "@node-llama-cpp/linux-x64-cuda": "3.14.5", + "@node-llama-cpp/linux-x64-cuda-ext": "3.14.5", + "@node-llama-cpp/linux-x64-vulkan": "3.14.5", + "@node-llama-cpp/mac-arm64-metal": "3.14.5", + "@node-llama-cpp/mac-x64": "3.14.5", + "@node-llama-cpp/win-arm64": "3.14.5", + "@node-llama-cpp/win-x64": "3.14.5", + "@node-llama-cpp/win-x64-cuda": "3.14.5", + "@node-llama-cpp/win-x64-cuda-ext": "3.14.5", + "@node-llama-cpp/win-x64-vulkan": "3.14.5" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/node-llama-cpp/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/node-llama-cpp/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/node-llama-cpp/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-llama-cpp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-llama-cpp/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-llama-cpp/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/node-llama-cpp/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/octokit": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/octokit/-/octokit-5.0.5.tgz", + "integrity": "sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==", + "license": "MIT", + "dependencies": { + "@octokit/app": "^16.1.2", + "@octokit/core": "^7.0.6", + "@octokit/oauth-app": "^8.0.3", + "@octokit/plugin-paginate-graphql": "^6.0.0", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-rest-endpoint-methods": "^17.0.0", + "@octokit/plugin-retry": "^8.0.3", + "@octokit/plugin-throttling": "^11.0.3", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "@octokit/webhooks": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", "dependencies": { - "@ai-sdk/provider": "^2.0.0", - "@ai-sdk/provider-utils": "^3.0.17" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=18" + "node": ">=12" }, - "peerDependencies": { - "zod": "^4.0.16" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/p-limit": { @@ -1310,6 +2993,18 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1323,7 +3018,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1353,6 +3047,59 @@ "dev": true, "license": "ISC" }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -1367,6 +3114,44 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -1385,7 +3170,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1399,11 +3183,35 @@ "node": ">=0.10.0" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -1419,6 +3227,18 @@ } ] }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -1428,11 +3248,16 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -1445,7 +3270,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1455,7 +3279,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -1464,6 +3287,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-git": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", + "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, "node_modules/sinon": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-21.0.0.tgz", @@ -1482,11 +3320,169 @@ "url": "https://opencollective.com/sinon" } }, + "node_modules/sleep-promise": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-9.1.0.tgz", + "integrity": "sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==", + "license": "MIT" + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdout-update": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/stdout-update/-/stdout-update-4.0.1.tgz", + "integrity": "sha512-wiS21Jthlvl1to+oorePvcyrIkiG/6M3D3VTmDUlJm7Cy6SbFhKkAvX+YBuHLxck/tO3mrdpC/cNesigQc3+UQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.2.0", + "ansi-styles": "^6.2.1", + "string-width": "^7.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/stdout-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/stdout-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/stdout-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/stdout-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdout-update/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/steno": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz", + "integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1516,7 +3512,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1562,6 +3557,41 @@ "node": ">=8" } }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -1571,11 +3601,52 @@ "node": ">=4" } }, + "node_modules/universal-github-app-jwt": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz", + "integrity": "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==", + "license": "MIT" + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -1587,6 +3658,15 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/workerpool": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", @@ -1598,7 +3678,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -1635,12 +3714,17 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/yaml": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", @@ -1660,7 +3744,6 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -1679,7 +3762,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -1724,6 +3806,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", diff --git a/common/package.json b/common/package.json index bab8fed..1cde895 100644 --- a/common/package.json +++ b/common/package.json @@ -28,7 +28,6 @@ "@ai-sdk/anthropic": "^2.0.54", "@ai-sdk/google": "^3.0.0-beta.72", "@ai-sdk/openai": "^2.0.80", - "ollama-ai-provider-v2": "^1.2.0", "@apidevtools/json-schema-ref-parser": "^15.1.3", "ai": "^5.0.109", "ajv": "^8.17.1", @@ -36,6 +35,7 @@ "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", + "node-llama-cpp": "^3.9.0", "yaml": "^2.8.2", "zod": "^4.1.13" } diff --git a/common/src/ai.js b/common/src/ai.js index 17b6b13..48cc2e0 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -2,14 +2,17 @@ const { generateText, generateObject, jsonSchema } = require("ai"); const { createOpenAI } = require("@ai-sdk/openai"); const { createAnthropic } = require("@ai-sdk/anthropic"); const { createGoogleGenerativeAI } = require("@ai-sdk/google"); -const { createOllama } = require("ollama-ai-provider-v2"); const { z } = require("zod"); const Ajv = require("ajv"); const addFormats = require("ajv-formats"); - -const DEFAULT_MODEL = "ollama/qwen3-vl:2b"; -const OLLAMA_AVAILABILITY_TIMEOUT_MS = 500; -const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434/api"; +const { + isLocalLlmAvailable, + generateWithLocalLlm, + DEFAULT_LOCAL_MODEL, + DEFAULT_LOCAL_MODEL_SMALL, +} = require("./localLlm"); + +const DEFAULT_MODEL = "local/qwen3-vl:2b"; const MAX_SCHEMA_VALIDATION_RETRIES = 3; /** @@ -28,36 +31,13 @@ const modelMap = { "google/gemini-2.5-flash": "gemini-2.5-flash", "google/gemini-2.5-pro": "gemini-2.5-pro", "google/gemini-3-pro": "gemini-3-pro-preview", - // Ollama models - "ollama/qwen3-vl:8b": "hf.co/unsloth/Qwen3-VL-8B-Instruct-GGUF:UD-Q4_K_XL", - "ollama/qwen3-vl:2b": "hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M", + // Local models (node-llama-cpp with GGUF files) + "local/qwen3-vl:8b": "hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL", + "local/qwen3-vl:2b": "hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M", }; -/** - * Checks if Ollama is available at localhost:11434. - * @param {string} [baseUrl] - Optional base URL override. - * @returns {Promise} True if Ollama is available. - */ -const isOllamaAvailable = async (baseUrl) => { - const url = baseUrl || "http://localhost:11434"; - try { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), OLLAMA_AVAILABILITY_TIMEOUT_MS); - - const response = await fetch(url, { - method: "GET", - signal: controller.signal, - }); - - clearTimeout(timeoutId); - return response.ok; - } catch { - return false; - } -}; - -const getDefaultProvider = async (config = {}) => { - const ollamaBaseUrl = config?.integrations?.ollama?.baseUrl; +const getDefaultProvider = async (config = {}) => { + const localLlmConfig = config?.integrations?.localLlm; // Try to detect from environment variables if no model is provided if (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) { return { @@ -77,13 +57,14 @@ const getDefaultProvider = async (config = {}) => { model: "gemini-2.5-flash", apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google.apiKey, }; - } else if (await isOllamaAvailable(ollamaBaseUrl)) { - // Local, no API key needed + } else if (await isLocalLlmAvailable()) { + // Local LLM via node-llama-cpp, no API key needed return { - provider: "ollama", - model: modelMap["ollama/qwen3-vl:8b"], + provider: "local", + model: localLlmConfig?.defaultModel || modelMap["local/qwen3-vl:8b"], + modelUri: localLlmConfig?.defaultModel || modelMap["local/qwen3-vl:8b"], + modelsDir: localLlmConfig?.modelsDir, apiKey: null, - baseURL: ollamaBaseUrl || DEFAULT_OLLAMA_BASE_URL, }; } else { return { provider: null, model: null, apiKey: null }; @@ -94,15 +75,21 @@ const getDefaultProvider = async (config = {}) => { * Detects the provider, model, and API from a model string and environment variables. * @param {Object} config - The Doc Detective configuration object. * @param {string} model - The model identifier. - * @returns {Promise<{ provider: "openai" | "anthropic" | "ollama" | null, model: string | null, apiKey: string | null, baseURL?: string }>} The detected provider, model, and API key. + * @returns {Promise<{ provider: "openai" | "anthropic" | "google" | "local" | null, model: string | null, apiKey: string | null, modelUri?: string, modelsDir?: string }>} The detected provider, model, and API key. */ const detectProvider = async (config, model) => { const detectedModel = modelMap[model] || null; if (!detectedModel) return getDefaultProvider(config); - if (model.startsWith("ollama/")) { - const ollamaBaseUrl = config.integrations?.ollama?.baseUrl || DEFAULT_OLLAMA_BASE_URL; - return { provider: "ollama", model: detectedModel, apiKey: null, baseURL: ollamaBaseUrl }; + if (model.startsWith("local/")) { + const localLlmConfig = config?.integrations?.localLlm; + return { + provider: "local", + model: detectedModel, + modelUri: detectedModel, + modelsDir: localLlmConfig?.modelsDir, + apiKey: null, + }; } if (model.startsWith("anthropic/") && (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic)) { @@ -125,17 +112,17 @@ const detectProvider = async (config, model) => { /** * Creates a provider instance based on the provider name. + * Note: For "local" provider, this returns null as local LLM uses a different generation path. * @param {Object} options - * @param {"openai" | "anthropic" | "ollama"} options.provider - The provider name. + * @param {"openai" | "anthropic" | "google" | "local"} options.provider - The provider name. * @param {string} [options.apiKey] - Optional API key override. * @param {string} [options.baseURL] - Optional base URL override. - * @returns {Function} The provider factory function. + * @returns {Function | null} The provider factory function, or null for local provider. */ const createProvider = ({ provider, apiKey, baseURL }) => { - if (provider === "ollama") { - const options = {}; - if (baseURL) options.baseURL = baseURL; - return createOllama(options); + if (provider === "local") { + // Local LLM uses generateWithLocalLlm directly, not the AI SDK provider pattern + return null; } if (provider === "openai") { @@ -406,11 +393,26 @@ const generate = async ({ if (!detected.provider) { throw new Error( - `Cannot determine provider for model "${model}". Please specify a 'provider' option ("openai" or "anthropic").` + `Cannot determine provider for model "${model}". Please specify a 'provider' option ("openai", "anthropic", "google", or "local").` ); } - // Create provider instance + // Handle local LLM provider separately + if (detected.provider === "local") { + return generateWithLocalLlm({ + prompt, + messages, + files, + modelUri: detected.modelUri, + modelsDir: detected.modelsDir, + system, + schema, + temperature, + maxTokens, + }); + } + + // Create provider instance for cloud providers const providerFactory = createProvider({ provider: detected.provider, apiKey: detected.apiKey, @@ -617,7 +619,7 @@ module.exports = { generate, detectProvider, getApiKey, - isOllamaAvailable, + isLocalLlmAvailable, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, diff --git a/common/src/index.js b/common/src/index.js index eab5c17..646bca3 100644 --- a/common/src/index.js +++ b/common/src/index.js @@ -2,19 +2,19 @@ const { schemas } = require("./schemas"); const { validate, transformToSchemaKey } = require("./validate"); const { resolvePaths } = require("./resolvePaths"); const { readFile } = require("./files"); -const { generate, detectProvider, getApiKey, isOllamaAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); +const { generate, detectProvider, getApiKey, isLocalLlmAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); const { refineStep } = require("./refineStep"); const { - DEFAULT_OLLAMA_MODEL, - MODEL_PULL_TIMEOUT_MS, - OLLAMA_STARTUP_TIMEOUT_MS, - detectGpuType, - startOllamaContainer, - waitForOllama, - pullOllamaModel, - stopOllamaContainer, - ensureOllamaRunning, -} = require("./ollama"); + DEFAULT_LOCAL_MODEL, + DEFAULT_LOCAL_MODEL_SMALL, + MODEL_DOWNLOAD_TIMEOUT_MS, + getModelsDir, + ensureModelAvailable, + loadModel, + createLocalSession, + generateWithLocalLlm, + disposeLocalLlm, +} = require("./localLlm"); module.exports = { schemas, @@ -25,17 +25,17 @@ module.exports = { generate, detectProvider, getApiKey, - isOllamaAvailable, + isLocalLlmAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, refineStep, - DEFAULT_OLLAMA_MODEL, - MODEL_PULL_TIMEOUT_MS, - OLLAMA_STARTUP_TIMEOUT_MS, - detectGpuType, - startOllamaContainer, - waitForOllama, - pullOllamaModel, - stopOllamaContainer, - ensureOllamaRunning, + DEFAULT_LOCAL_MODEL, + DEFAULT_LOCAL_MODEL_SMALL, + MODEL_DOWNLOAD_TIMEOUT_MS, + getModelsDir, + ensureModelAvailable, + loadModel, + createLocalSession, + generateWithLocalLlm, + disposeLocalLlm, }; diff --git a/common/src/localLlm.js b/common/src/localLlm.js new file mode 100644 index 0000000..5630c37 --- /dev/null +++ b/common/src/localLlm.js @@ -0,0 +1,341 @@ +const fs = require("fs"); +const os = require("os"); +const path = require("path"); + +/** Default local model URI (Qwen3-VL 8B for multimodal support) */ +const DEFAULT_LOCAL_MODEL = "hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL"; + +/** Smaller model for testing */ +const DEFAULT_LOCAL_MODEL_SMALL = "hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"; + +/** Maximum time to wait for model download (15 minutes) */ +const MODEL_DOWNLOAD_TIMEOUT_MS = 15 * 60 * 1000; + +/** Cached llama instance for reuse */ +let cachedLlama = null; + +/** Cached model instances by path */ +const cachedModels = new Map(); + +/** Cached sessions by model path */ +const cachedSessions = new Map(); + +/** + * Gets the models directory path, creating it if it doesn't exist. + * @param {string} [customDir] - Optional custom directory override. + * @returns {string} The models directory path. + */ +const getModelsDir = (customDir) => { + const modelsDir = customDir || path.join(os.tmpdir(), "doc-detective", "models"); + + if (!fs.existsSync(modelsDir)) { + fs.mkdirSync(modelsDir, { recursive: true }); + } + + return modelsDir; +}; + +/** + * Dynamically imports node-llama-cpp (ESM module). + * @returns {Promise} The node-llama-cpp module. + */ +const importNodeLlamaCpp = async () => { + return import("node-llama-cpp"); +}; + +/** + * Gets or creates a cached Llama instance. + * @returns {Promise} The Llama instance. + */ +const getLlamaInstance = async () => { + if (cachedLlama) { + return cachedLlama; + } + + const { getLlama } = await importNodeLlamaCpp(); + cachedLlama = await getLlama(); + return cachedLlama; +}; + +/** + * Checks if the local LLM is available (node-llama-cpp can initialize). + * @returns {Promise} True if local LLM is available. + */ +const isLocalLlmAvailable = async () => { + try { + await getLlamaInstance(); + return true; + } catch { + return false; + } +}; + +/** + * Ensures a model is available locally, downloading if necessary. + * @param {string} [modelUri=DEFAULT_LOCAL_MODEL] - The model URI (e.g., "hf:user/model:quant"). + * @param {string} [modelsDir] - Optional custom models directory. + * @returns {Promise} The local path to the model file. + */ +const ensureModelAvailable = async (modelUri = DEFAULT_LOCAL_MODEL, modelsDir) => { + const { resolveModelFile } = await importNodeLlamaCpp(); + const dir = getModelsDir(modelsDir); + + console.log(` Ensuring model available: ${modelUri}`); + console.log(` Models directory: ${dir}`); + + const modelPath = await resolveModelFile(modelUri, dir, { + cli: true, // Show download progress in console + }); + + console.log(` Model ready at: ${modelPath}`); + return modelPath; +}; + +/** + * Loads a model from the given path, using cache if available. + * @param {string} modelPath - The path to the model file. + * @returns {Promise} The loaded model instance. + */ +const loadModel = async (modelPath) => { + if (cachedModels.has(modelPath)) { + return cachedModels.get(modelPath); + } + + const llama = await getLlamaInstance(); + const model = await llama.loadModel({ modelPath }); + cachedModels.set(modelPath, model); + return model; +}; + +/** + * Creates a chat session for the given model. + * @param {string} modelPath - The path to the model file. + * @returns {Promise} An object with session and related utilities. + */ +const createLocalSession = async (modelPath) => { + if (cachedSessions.has(modelPath)) { + return cachedSessions.get(modelPath); + } + + const { LlamaChatSession } = await importNodeLlamaCpp(); + const model = await loadModel(modelPath); + const context = await model.createContext(); + const session = new LlamaChatSession({ + contextSequence: context.getSequence(), + }); + + const sessionData = { model, context, session }; + cachedSessions.set(modelPath, sessionData); + return sessionData; +}; + +/** + * Converts a file object to the format expected by node-llama-cpp for multimodal input. + * @param {Object} llama - The Llama instance. + * @param {Object} file - The file object. + * @param {string} file.type - The file type (e.g., "image"). + * @param {string | Buffer | Uint8Array} file.data - Base64 string, URL, Buffer, or Uint8Array. + * @param {string} [file.mimeType] - The MIME type (e.g., "image/png"). + * @returns {Promise} The image object for node-llama-cpp. + */ +const fileToLlamaImage = async (llama, file) => { + if (file.type !== "image") { + throw new Error(`Unsupported file type: ${file.type}. Only "image" is supported.`); + } + + // Convert data to Buffer if needed + let imageBuffer; + if (Buffer.isBuffer(file.data)) { + imageBuffer = file.data; + } else if (file.data instanceof Uint8Array) { + imageBuffer = Buffer.from(file.data); + } else if (typeof file.data === "string") { + if (file.data.startsWith("http://") || file.data.startsWith("https://")) { + // URL - fetch and convert to buffer + const response = await fetch(file.data); + const arrayBuffer = await response.arrayBuffer(); + imageBuffer = Buffer.from(arrayBuffer); + } else { + // Assume base64 + imageBuffer = Buffer.from(file.data, "base64"); + } + } else { + throw new Error("Unsupported image data format"); + } + + // Create image using llama's createImage helper if available + // For now, return buffer that can be used with vision models + return { type: "image", data: imageBuffer }; +}; + +/** + * Generates text or structured output using a local LLM. + * @param {Object} options - Generation options. + * @param {string} [options.prompt] - The text prompt. + * @param {Array} [options.messages] - Array of messages for conversation. + * @param {Array} [options.files] - Array of file objects (e.g., images for multimodal). + * @param {string} [options.modelPath] - Path to the model file. + * @param {string} [options.modelUri] - Model URI to download if modelPath not provided. + * @param {string} [options.system] - System message. + * @param {Object} [options.schema] - JSON schema for structured output. + * @param {string} [options.modelsDir] - Custom models directory. + * @param {number} [options.temperature] - Temperature for generation. + * @param {number} [options.maxTokens] - Maximum tokens to generate. + * @returns {Promise} Generation result with text or object. + */ +const generateWithLocalLlm = async ({ + prompt, + messages, + files, + modelPath, + modelUri = DEFAULT_LOCAL_MODEL, + system, + schema, + modelsDir, + temperature, + maxTokens, +}) => { + // Ensure model is available + const resolvedModelPath = modelPath || await ensureModelAvailable(modelUri, modelsDir); + + // Create session + const { session, model } = await createLocalSession(resolvedModelPath); + const llama = await getLlamaInstance(); + + // Build the prompt from messages if provided + let finalPrompt = prompt || ""; + if (messages && messages.length > 0) { + // Extract the last user message as the prompt + const lastUserMessage = messages.filter(m => m.role === "user").pop(); + if (lastUserMessage) { + finalPrompt = lastUserMessage.content; + } + } + + // Add system message prefix if provided + if (system && finalPrompt) { + finalPrompt = `${system}\n\n${finalPrompt}`; + } + + // Build prompt options + const promptOptions = {}; + + if (temperature !== undefined) { + promptOptions.temperature = temperature; + } + + if (maxTokens !== undefined) { + promptOptions.maxTokens = maxTokens; + } + + // Handle multimodal input (images) + if (files && files.length > 0) { + const images = []; + for (const file of files) { + if (file.type === "image") { + const llamaImage = await fileToLlamaImage(llama, file); + images.push(llamaImage); + } + } + if (images.length > 0) { + // Note: The exact API for passing images may vary based on node-llama-cpp version + // This is a placeholder for the multimodal handling + promptOptions.images = images; + } + } + + // Handle structured output with JSON schema + if (schema) { + try { + const grammar = await llama.createGrammarForJsonSchema(schema); + promptOptions.grammar = grammar; + + const response = await session.prompt(finalPrompt, promptOptions); + const parsedObject = grammar.parse(response); + + return { + object: parsedObject, + usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, // Token tracking not easily available + finishReason: "stop", + }; + } catch (grammarError) { + // If grammar creation fails, try without grammar and parse manually + console.warn("Grammar creation failed, attempting without structured output:", grammarError.message); + const response = await session.prompt(finalPrompt, promptOptions); + + try { + const parsedObject = JSON.parse(response); + return { + object: parsedObject, + usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, + finishReason: "stop", + }; + } catch { + throw new Error(`Failed to generate structured output: ${grammarError.message}`); + } + } + } + + // Generate text response + const response = await session.prompt(finalPrompt, promptOptions); + + return { + text: response, + usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, + finishReason: "stop", + }; +}; + +/** + * Disposes of cached resources (models, sessions, llama instance). + * Call this when done with local LLM to free memory. + * @returns {Promise} + */ +const disposeLocalLlm = async () => { + // Dispose sessions + for (const [, { session, context }] of cachedSessions) { + try { + if (context && typeof context.dispose === "function") { + await context.dispose(); + } + } catch { + // Ignore disposal errors + } + } + cachedSessions.clear(); + + // Dispose models + for (const [, model] of cachedModels) { + try { + if (model && typeof model.dispose === "function") { + await model.dispose(); + } + } catch { + // Ignore disposal errors + } + } + cachedModels.clear(); + + // Dispose llama instance + if (cachedLlama && typeof cachedLlama.dispose === "function") { + try { + await cachedLlama.dispose(); + } catch { + // Ignore disposal errors + } + } + cachedLlama = null; +}; + +module.exports = { + DEFAULT_LOCAL_MODEL, + DEFAULT_LOCAL_MODEL_SMALL, + MODEL_DOWNLOAD_TIMEOUT_MS, + getModelsDir, + isLocalLlmAvailable, + ensureModelAvailable, + loadModel, + createLocalSession, + generateWithLocalLlm, + disposeLocalLlm, +}; diff --git a/common/src/ollama.js b/common/src/ollama.js deleted file mode 100644 index 42217aa..0000000 --- a/common/src/ollama.js +++ /dev/null @@ -1,198 +0,0 @@ -const { execSync, spawn } = require("child_process"); -const fs = require("fs"); -const { isOllamaAvailable, modelMap } = require("./ai"); - -/** Default Ollama model to use */ -const DEFAULT_OLLAMA_MODEL = modelMap["ollama/qwen3-vl:8b"]; - -/** Maximum time to wait for model pull (10 minutes) */ -const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; - -/** Maximum time to wait for Ollama startup (30 seconds) */ -const OLLAMA_STARTUP_TIMEOUT_MS = 30 * 1000; - -/** - * Detects available GPU type. - * @returns {"nvidia" | "amd" | "none"} The GPU type. - */ -const detectGpuType = () => { - // Check for Nvidia GPU - try { - execSync("nvidia-smi", { stdio: "ignore" }); - return "nvidia"; - } catch { - // nvidia-smi not available or failed - } - - // Check for AMD GPU - try { - if (fs.existsSync("/dev/kfd") && fs.existsSync("/dev/dri")) { - return "amd"; - } - } catch { - // fs check failed - } - - return "none"; -}; - -/** - * Starts the Ollama Docker container with appropriate GPU support. - * @returns {Promise} - */ -const startOllamaContainer = async () => { - const gpuType = detectGpuType(); - console.log(` Detected GPU type: ${gpuType}`); - - let dockerArgs; - switch (gpuType) { - case "nvidia": - dockerArgs = [ - "run", "-d", - "--gpus=all", - "-v", "ollama:/root/.ollama", - "-p", "11434:11434", - "--name", "ollama", - "ollama/ollama" - ]; - break; - case "amd": - dockerArgs = [ - "run", "-d", - "--device", "/dev/kfd", - "--device", "/dev/dri", - "-v", "ollama:/root/.ollama", - "-p", "11434:11434", - "--name", "ollama", - "ollama/ollama:rocm" - ]; - break; - default: - dockerArgs = [ - "run", "-d", - "-v", "ollama:/root/.ollama", - "-p", "11434:11434", - "--name", "ollama", - "ollama/ollama" - ]; - } - - console.log(` Starting Ollama container...`); - execSync(`docker ${dockerArgs.join(" ")}`, { stdio: "inherit" }); -}; - -/** - * Waits for Ollama to become available. - * @param {number} [timeoutMs=OLLAMA_STARTUP_TIMEOUT_MS] - Maximum time to wait. - * @returns {Promise} True if Ollama became available. - */ -const waitForOllama = async (timeoutMs = OLLAMA_STARTUP_TIMEOUT_MS) => { - const startTime = Date.now(); - - while (Date.now() - startTime < timeoutMs) { - try { - const response = await fetch("http://localhost:11434"); - if (response.ok) { - return true; - } - } catch { - // Not ready yet - } - await new Promise(resolve => setTimeout(resolve, 1000)); - } - - return false; -}; - -/** - * Pulls the specified Ollama model with progress output. - * @param {string} [model=DEFAULT_OLLAMA_MODEL] - The model to pull. - * @returns {Promise} - */ -const pullOllamaModel = async (model = DEFAULT_OLLAMA_MODEL) => { - console.log(` Pulling ${model} model (this may take up to 10 minutes on first run)...`); - - return new Promise((resolve, reject) => { - const pullProcess = spawn("docker", ["exec", "ollama", "ollama", "pull", model], { - stdio: "inherit" - }); - - const timeoutId = setTimeout(() => { - pullProcess.kill(); - reject(new Error("Model pull timed out after 10 minutes")); - }, MODEL_PULL_TIMEOUT_MS); - - pullProcess.on("close", (code) => { - clearTimeout(timeoutId); - if (code === 0) { - console.log(` Model ${model} is ready.`); - resolve(); - } else { - reject(new Error(`Model pull failed with exit code ${code}`)); - } - }); - - pullProcess.on("error", (err) => { - clearTimeout(timeoutId); - reject(err); - }); - }); -}; - -/** - * Stops and removes the Ollama container. - * @returns {Promise} - */ -const stopOllamaContainer = async () => { - try { - console.log(` Stopping Ollama container...`); - execSync("docker stop ollama", { stdio: "ignore" }); - } catch { - // Container may not be running - } - try { - execSync("docker rm ollama", { stdio: "ignore" }); - console.log(` Ollama container removed.`); - } catch { - // Container may not exist - } -}; - -/** - * Ensures Ollama is running, starting a Docker container if needed. - * @param {string} [model=DEFAULT_OLLAMA_MODEL] - The model to ensure is available. - * @returns {Promise} True if Ollama is available. - */ -const ensureOllamaRunning = async (model = DEFAULT_OLLAMA_MODEL) => { - if (await isOllamaAvailable()) { - console.log(" Ollama is already running."); - return true; - } - - console.log(" Ollama not detected, starting Docker container..."); - - // Clean up any existing container first - await stopOllamaContainer(); - - await startOllamaContainer(); - - const available = await waitForOllama(); - if (!available) { - throw new Error("Ollama container started but did not become available"); - } - - await pullOllamaModel(model); - return true; -}; - -module.exports = { - DEFAULT_OLLAMA_MODEL, - MODEL_PULL_TIMEOUT_MS, - OLLAMA_STARTUP_TIMEOUT_MS, - detectGpuType, - startOllamaContainer, - waitForOllama, - pullOllamaModel, - stopOllamaContainer, - ensureOllamaRunning, -}; diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index c187bfa..bc4f48e 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -10419,18 +10419,21 @@ }, "title": "OpenAI" }, - "ollama": { + "localLlm": { "type": "object", - "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "baseUrl": { + "modelsDir": { "type": "string", - "description": "Base URL for the Ollama API.", - "default": "http://localhost:11434/api" + "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." + }, + "defaultModel": { + "type": "string", + "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." } }, - "title": "Ollama" + "title": "Local LLM" }, "google": { "type": "object", diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index ba60461..16c5515 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -10432,18 +10432,21 @@ }, "title": "OpenAI" }, - "ollama": { + "localLlm": { "type": "object", - "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "baseUrl": { + "modelsDir": { "type": "string", - "description": "Base URL for the Ollama API.", - "default": "http://localhost:11434/api" + "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." + }, + "defaultModel": { + "type": "string", + "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." } }, - "title": "Ollama" + "title": "Local LLM" }, "google": { "type": "object", diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index c4d37af..c2e970a 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -10817,18 +10817,21 @@ }, "title": "OpenAI" }, - "ollama": { + "localLlm": { "type": "object", - "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "baseUrl": { + "modelsDir": { "type": "string", - "description": "Base URL for the Ollama API.", - "default": "http://localhost:11434/api" + "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." + }, + "defaultModel": { + "type": "string", + "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." } }, - "title": "Ollama" + "title": "Local LLM" }, "google": { "type": "object", @@ -34991,18 +34994,21 @@ }, "title": "OpenAI" }, - "ollama": { + "localLlm": { "type": "object", - "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "baseUrl": { + "modelsDir": { + "type": "string", + "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." + }, + "defaultModel": { "type": "string", - "description": "Base URL for the Ollama API.", - "default": "http://localhost:11434/api" + "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." } }, - "title": "Ollama" + "title": "Local LLM" }, "google": { "type": "object", diff --git a/common/src/schemas/src_schemas/config_v3.schema.json b/common/src/schemas/src_schemas/config_v3.schema.json index 3858229..5247a18 100644 --- a/common/src/schemas/src_schemas/config_v3.schema.json +++ b/common/src/schemas/src_schemas/config_v3.schema.json @@ -247,18 +247,21 @@ }, "title": "OpenAI" }, - "ollama": { + "localLlm": { "type": "object", - "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", + "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "baseUrl": { + "modelsDir": { "type": "string", - "description": "Base URL for the Ollama API.", - "default": "http://localhost:11434/api" + "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." + }, + "defaultModel": { + "type": "string", + "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." } }, - "title": "Ollama" + "title": "Local LLM" }, "google": { "type": "object", diff --git a/common/test/ai.test.js b/common/test/ai.test.js index ddfb070..ab3541e 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -1,13 +1,11 @@ const { z } = require("zod"); const { - ensureOllamaRunning, - stopOllamaContainer, - MODEL_PULL_TIMEOUT_MS, -} = require("../src/ollama"); - -// Track if we started the container -let weStartedOllama = false; + ensureModelAvailable, + disposeLocalLlm, + MODEL_DOWNLOAD_TIMEOUT_MS, + DEFAULT_LOCAL_MODEL_SMALL, +} = require("../src/localLlm"); // Import chai using dynamic import (needed for ESM) let expect; @@ -17,33 +15,35 @@ const { generate, detectProvider, getApiKey, - isOllamaAvailable, + isLocalLlmAvailable, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, } = require("../src/ai"); describe("AI Module", function () { - // Increase timeout for real API calls and container setup - this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); + // Increase timeout for real API calls and model download + this.timeout(MODEL_DOWNLOAD_TIMEOUT_MS + 120000); before(async function () { // Dynamic import for chai ESM const chai = await import("chai"); expect = chai.expect; - console.log(" Setting up Ollama for tests..."); - // Track if we need to start the container - const wasAlreadyRunning = await isOllamaAvailable(); - await ensureOllamaRunning(); - weStartedOllama = !wasAlreadyRunning; + console.log(" Setting up local LLM for tests..."); + // Ensure the model is downloaded before running tests + try { + await ensureModelAvailable(DEFAULT_LOCAL_MODEL_SMALL); + console.log(" Local LLM model ready."); + } catch (error) { + console.log(" Warning: Could not set up local LLM:", error.message); + console.log(" Some tests will be skipped."); + } }); after(async function () { - if (weStartedOllama) { - console.log(" Cleaning up Ollama container..."); - await stopOllamaContainer(); - } + console.log(" Cleaning up local LLM resources..."); + await disposeLocalLlm(); }); describe("modelMap", function () { @@ -59,9 +59,9 @@ describe("AI Module", function () { expect(modelMap["openai/gpt-5-nano"]).to.equal("gpt-5-nano"); }); - it("should contain Ollama model mappings", function () { - expect(modelMap["ollama/qwen3-vl:2b"]).to.equal("hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); - expect(modelMap["ollama/qwen3-vl:8b"]).to.equal("hf.co/unsloth/Qwen3-VL-8B-Instruct-GGUF:UD-Q4_K_XL"); + it("should contain local model mappings", function () { + expect(modelMap["local/qwen3-vl:2b"]).to.equal("hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); + expect(modelMap["local/qwen3-vl:8b"]).to.equal("hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL"); }); it("should contain Google Gemini model mappings", function () { @@ -106,20 +106,20 @@ describe("AI Module", function () { } }); - it("should detect Ollama provider for known Ollama models", async function () { + it("should detect local provider for known local models", async function () { const config = {}; - const result = await detectProvider(config, "ollama/qwen3-vl:2b"); - expect(result.provider).to.equal("ollama"); - expect(result.model).to.equal("hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); + const result = await detectProvider(config, "local/qwen3-vl:2b"); + expect(result.provider).to.equal("local"); + expect(result.model).to.equal("hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); + expect(result.modelUri).to.equal("hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); expect(result.apiKey).to.be.null; - expect(result.baseURL).to.equal("http://localhost:11434/api"); }); - it("should use custom baseUrl from config for Ollama", async function () { - const config = { integrations: { ollama: { baseUrl: "http://custom:11434/api" } } }; - const result = await detectProvider(config, "ollama/qwen3-vl:2b"); - expect(result.provider).to.equal("ollama"); - expect(result.baseURL).to.equal("http://custom:11434/api"); + it("should use custom modelsDir from config for local provider", async function () { + const config = { integrations: { localLlm: { modelsDir: "/custom/models/dir" } } }; + const result = await detectProvider(config, "local/qwen3-vl:2b"); + expect(result.provider).to.equal("local"); + expect(result.modelsDir).to.equal("/custom/models/dir"); }); it("should detect Anthropic provider and mapped model for known Anthropic models with config API key", async function () { @@ -221,12 +221,16 @@ describe("AI Module", function () { expect((await detectProvider(config, "anthropic/claude-haiku-4.5")).apiKey).to.equal("sk-ant-env"); }); - it("should fall back to Ollama as default provider when available", async function () { + it("should fall back to local provider as default when available", async function () { const config = {}; const result = await detectProvider(config, "unknown-model"); - // Ollama should be preferred when available - expect(result.provider).to.equal("ollama"); - expect(result.model).to.equal("qwen3-vl:2b"); + // Local LLM should be preferred when available + if (await isLocalLlmAvailable()) { + expect(result.provider).to.equal("local"); + expect(result.modelUri).to.be.a("string"); + } else { + expect(result.provider).to.be.null; + } }); it("should return null values when model is known but no API key for that provider", async function () { @@ -240,8 +244,8 @@ describe("AI Module", function () { }); describe("DEFAULT_MODEL", function () { - it("should be ollama/qwen3-vl:2b", function () { - expect(DEFAULT_MODEL).to.equal("ollama/qwen3-vl:2b"); + it("should be local/qwen3-vl:2b", function () { + expect(DEFAULT_MODEL).to.equal("local/qwen3-vl:2b"); }); }); @@ -271,9 +275,9 @@ describe("AI Module", function () { } }); - it("should throw error when provider cannot be determined and Ollama not available", async function () { + it("should throw error when provider cannot be determined and local LLM not available", async function () { // This test verifies error handling when no provider is available - // Since Ollama is running, we need to test with an explicit model that + // Since local LLM may be running, we need to test with an explicit model that // requires an API key that isn't configured const originalAnthropicKey = process.env.ANTHROPIC_API_KEY; const originalOpenAIKey = process.env.OPENAI_API_KEY; @@ -300,9 +304,9 @@ describe("AI Module", function () { }); describe("text generation", function () { - it("should generate text with default model (Ollama)", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + it("should generate text with default model (local LLM)", async function () { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -317,16 +321,16 @@ describe("AI Module", function () { expect(result.finishReason).to.be.a("string"); }); - it("should generate text with explicit Ollama model", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + it("should generate text with explicit local model", async function () { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } try { const result = await generate({ prompt: "Reply with exactly one word: Yes", - model: "ollama/qwen3-vl:2b", + model: "local/qwen3-vl:2b", maxTokens: 20, }); @@ -335,15 +339,15 @@ describe("AI Module", function () { expect(result.usage).to.be.an("object"); expect(result.finishReason).to.be.a("string"); } catch (error) { - // Skip if we get an Internal Server Error (model may not be available) - if (error.message && error.message.includes("Internal Server Error")) { + // Skip if we get an error (model may not be available) + if (error.message && error.message.includes("model")) { this.skip(); } throw error; } }); - it("should generate text with OpenAI model", async function () { + it("should generate text with OpenAI model (smoke test)", async function () { // Skip if no API key is set if (!process.env.OPENAI_API_KEY) { this.skip(); @@ -351,7 +355,7 @@ describe("AI Module", function () { const result = await generate({ prompt: "Say exactly: Hello World", - model: "openai/gpt-4o-mini", + model: "openai/gpt-5-mini", maxTokens: 50, }); @@ -398,8 +402,8 @@ describe("AI Module", function () { }); it("should include system message in generation", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -432,8 +436,8 @@ describe("AI Module", function () { }; it("should generate valid structured output with Zod schema", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -453,8 +457,8 @@ describe("AI Module", function () { }); it("should generate valid structured output with JSON schema", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -474,8 +478,8 @@ describe("AI Module", function () { }); it("should validate generated object against Zod schema", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -498,8 +502,8 @@ describe("AI Module", function () { }); it("should validate generated object against JSON schema", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -529,15 +533,15 @@ describe("AI Module", function () { describe("multimodal input with files", function () { // 100x100 grid PNG with red, blue, and green squares - const GRID_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABvUlEQVR4nO3YUW7DQAwD0b3/pZ0jhEjW2rE5LfT3ANGlE0Bda63LQc26kh/dmMMHbHP4gG0OH7DN4QO2OXzANocP2ObwAdscPmCbyy7Ia/McuICfMllzdxSy+c16i7MQmLMQmLMQmLMQmLMQmLMQmLMQmLMQmPNSh42fEJizEJizEJizEJizEJizEJizEJizEJizEJg7fpk6v1zqujGHD9jm8AHbHD5gm8MHbHP4gG0OH7DN4QO2OXzANnf8Mv0yu/9rc/p5Hn+p7y/kzHO85ivLQqYWh85CphaHzkKmFofOQqYWh85CphaHzkKmFofOQqYWh66wEPbsLwQ+9Dem8BNyaHHoLGRqcegsZGpx6CxkanHoLGRqcegsZGpx6CxkanHoLGRqcegKC3FQg39j2hw+YJvDB2xz+IBtDh+wzeEDtjl8wDaHD9jm8AHb3PHLlDm7f73U/3Q3FBLmg/9hLOTPB3mLsxCYsxCYsxCYsxCYsxCYsxCYO1mI46XOd35lwZyFwJyFwJyFwJyFwJyFwJyFwJyFwNzJQhzUwN/UPocP2ObwAdscPmCbwwdsc/iAbQ4fsM3hA7Y5fMAq9wGhbdAbu3rjOQAAAABJRU5ErkJggg=="; + const GRID_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABvUlEQVR4nO3YUW7DQAwD0b3/pZ0jhEjW2rE5LfT3ANGlE0Bda63LQc26kh/dmMMHbHP4gG0OH7DN4QO2OXzANocP2ObwAdscPmCbyy7Ia/McuICfMllzdxSy+c16i7MQmLMQmLMQmLMQmLMQmLMQmLMQmPNSh42fEJizEJizEJizEJizEJizEJizEJizEJizEJg7fpk6v1zqujGHD9jm8AHbHD5gm8MHbHP4gG0OH7DN4QO2OXzANnf8Mv0yu/9rc/p5Hn+p7y/kzHO85ivLQqYWh85CphaHzkKmFofOQqYWh85CphaHzkKmFofOQqYWh66wEPbsLwQ+9Dem8BNyaHHoLGRqcegsZGpx6CxkanHoLGRqcegsZGpx6CxkanHoLGRqcegKC3FQg39j2hw+YJvDB2xz+IBtDh+wzeEDtjl8wDaHD9jm8AHb3PHLlDm7f73U/3Q3FBLmg/9hLOTPB3mLsxCYsxCYsxCYsxCYsxCYsxCYO1mI46XOd35lwZyFwJyFwJyFwJyFwJyFwJyFwJyFwNzJQhzUwN/UPocP2ObwAdscPmCbwwdsc/iAbQ4fsM3hA7Y5fMAq9wGhbdAbu3rjOQAAAABJRU5ErkJggg=="; it("should handle image URL input", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } - // Note: Some Ollama models may have issues with remote URLs. + // Note: Some local models may have issues with remote URLs. // This test validates the multimodal input construction. try { const result = await generate({ @@ -554,9 +558,9 @@ describe("AI Module", function () { expect(result.text).to.be.a("string"); expect(result.text.length).to.be.greaterThan(0); } catch (error) { - // Some Ollama models may not support remote URLs well - // Skip if we get a Bad Request error related to image handling - if (error.message && error.message.includes("Bad Request")) { + // Some local models may not support remote URLs well + // Skip if we get an error related to image handling + if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { this.skip(); } throw error; @@ -564,8 +568,8 @@ describe("AI Module", function () { }); it("should handle base64 image data", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -587,8 +591,8 @@ describe("AI Module", function () { expect(result.usage).to.be.an("object"); expect(result.finishReason).to.be.a("string"); } catch (error) { - // Some Ollama models may have issues with certain image formats - if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + // Some local models may have issues with certain image formats + if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { this.skip(); } throw error; @@ -596,8 +600,8 @@ describe("AI Module", function () { }); it("should handle Buffer image data", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -622,8 +626,8 @@ describe("AI Module", function () { expect(result.usage).to.be.an("object"); expect(result.finishReason).to.be.a("string"); } catch (error) { - // Some Ollama models may have issues with certain image formats - if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + // Some local models may have issues with certain image formats + if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { this.skip(); } throw error; @@ -631,8 +635,8 @@ describe("AI Module", function () { }); it("should handle Uint8Array image data", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -658,8 +662,8 @@ describe("AI Module", function () { expect(result.usage).to.be.an("object"); expect(result.finishReason).to.be.a("string"); } catch (error) { - // Some Ollama models may have issues with certain image formats - if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + // Some local models may have issues with certain image formats + if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { this.skip(); } throw error; @@ -667,8 +671,8 @@ describe("AI Module", function () { }); it("should handle multiple images with mixed data types", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -695,8 +699,8 @@ describe("AI Module", function () { expect(result.text).to.be.a("string"); expect(result.text.length).to.be.greaterThan(0); } catch (error) { - // Some Ollama models may have issues with certain image formats - if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { + // Some local models may have issues with certain image formats + if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { this.skip(); } throw error; @@ -706,8 +710,8 @@ describe("AI Module", function () { describe("messages array support", function () { it("should handle multi-turn conversation", async function () { - // Skip if Ollama is not available - if (!(await isOllamaAvailable())) { + // Skip if local LLM is not available + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -726,15 +730,16 @@ describe("AI Module", function () { }); describe("error handling", function () { - it("should throw error with invalid API key", async function () { + it("should throw error with invalid model", async function () { try { await generate({ prompt: "Hello", - apiKey: "invalid-api-key", + model: "anthropic/claude-haiku-4.5", + config: {}, }); expect.fail("Should have thrown an error"); } catch (error) { - // Should get an authentication error + // Should get an error about missing provider/API key expect(error).to.be.an("error"); } }); diff --git a/common/test/refineStep.test.js b/common/test/refineStep.test.js index d349aa8..a1fded4 100644 --- a/common/test/refineStep.test.js +++ b/common/test/refineStep.test.js @@ -6,23 +6,39 @@ const { REFINE_STEP_SYSTEM_PROMPT, DEFAULT_MAX_CONTEXT_LENGTH, } = require("../src/refineStep"); -const { isOllamaAvailable } = require("../src/ai"); -const { ensureOllamaRunning, MODEL_PULL_TIMEOUT_MS } = require("../src/ollama"); +const { isLocalLlmAvailable } = require("../src/ai"); +const { + ensureModelAvailable, + disposeLocalLlm, + MODEL_DOWNLOAD_TIMEOUT_MS, + DEFAULT_LOCAL_MODEL_SMALL, +} = require("../src/localLlm"); // Import chai using dynamic import (needed for ESM) let expect; describe("RefineStep Module", function () { - // Increase timeout for real API calls and container setup - this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); + // Increase timeout for real API calls and model download + this.timeout(MODEL_DOWNLOAD_TIMEOUT_MS + 120000); before(async function () { // Dynamic import for chai ESM const chai = await import("chai"); expect = chai.expect; - console.log(" Setting up Ollama for tests..."); - await ensureOllamaRunning(); + console.log(" Setting up local LLM for tests..."); + try { + await ensureModelAvailable(DEFAULT_LOCAL_MODEL_SMALL); + console.log(" Local LLM model ready."); + } catch (error) { + console.log(" Warning: Could not set up local LLM:", error.message); + console.log(" Some tests will be skipped."); + } + }); + + after(async function () { + console.log(" Cleaning up local LLM resources..."); + await disposeLocalLlm(); }); describe("truncateContent", function () { @@ -230,7 +246,7 @@ describe("RefineStep Module", function () { describe("step refinement", function () { it("should refine a step with failure context", async function () { // Skip if no API key is set - if (!(await isOllamaAvailable())) { + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -257,7 +273,7 @@ describe("RefineStep Module", function () { it("should preserve stepId from original step", async function () { // Skip if no API key is set - if (!(await isOllamaAvailable())) { + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -276,7 +292,7 @@ describe("RefineStep Module", function () { it("should preserve sourceLocation from original step", async function () { // Skip if no API key is set - if (!(await isOllamaAvailable())) { + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -306,7 +322,7 @@ describe("RefineStep Module", function () { it("should use model from config when provided", async function () { // Skip if no API key is set - if (!(await isOllamaAvailable())) { + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -343,7 +359,7 @@ describe("RefineStep Module", function () { it("should handle previous steps context", async function () { // Skip if no API key is set - if (!(await isOllamaAvailable())) { + if (!(await isLocalLlmAvailable())) { this.skip(); } @@ -370,7 +386,7 @@ describe("RefineStep Module", function () { describe("step validation", function () { it("should produce steps that pass schema validation", async function () { // Skip if no API key is set - if (!(await isOllamaAvailable())) { + if (!(await isLocalLlmAvailable())) { this.skip(); } From 19d63105a7430d39ab6b14093fd40b4194bc3f6d Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 12 Dec 2025 11:32:56 -0800 Subject: [PATCH 78/90] Revert "local llm changes" This reverts commit 6ca40a42d1d68b590cab49f46e37786b85308d2b. --- common/.github/workflows/npm-test.yml | 12 +- common/dev/dev.js | 1 - common/dist/schemas/config_v3.schema.json | 15 +- .../dist/schemas/resolvedTests_v3.schema.json | 15 +- common/package-lock.json | 2186 +---------------- common/package.json | 2 +- common/src/ai.js | 104 +- common/src/index.js | 42 +- common/src/localLlm.js | 341 --- common/src/ollama.js | 198 ++ .../output_schemas/config_v3.schema.json | 15 +- .../resolvedTests_v3.schema.json | 15 +- common/src/schemas/schemas.json | 30 +- .../schemas/src_schemas/config_v3.schema.json | 15 +- common/test/ai.test.js | 183 +- common/test/refineStep.test.js | 40 +- 16 files changed, 461 insertions(+), 2753 deletions(-) delete mode 100644 common/src/localLlm.js create mode 100644 common/src/ollama.js diff --git a/common/.github/workflows/npm-test.yml b/common/.github/workflows/npm-test.yml index 8be22b8..20fbb0d 100644 --- a/common/.github/workflows/npm-test.yml +++ b/common/.github/workflows/npm-test.yml @@ -16,7 +16,7 @@ on: jobs: test: - timeout-minutes: 30 + timeout-minutes: 5 runs-on: ${{ matrix.os }} strategy: matrix: @@ -36,16 +36,6 @@ jobs: cache: "npm" cache-dependency-path: package-lock.json node-version: ${{ matrix.node }} - - # Cache local LLM models for faster CI runs - - name: Cache local LLM models - uses: actions/cache@v4 - with: - path: ${{ runner.temp }}/doc-detective/models - key: llm-models-${{ runner.os }}-${{ hashFiles('package-lock.json') }} - restore-keys: | - llm-models-${{ runner.os }}- - - run: npm ci - run: npm run build # Automatically run tests because of the `postbuild` script in package.json diff --git a/common/dev/dev.js b/common/dev/dev.js index 1775999..d9254df 100644 --- a/common/dev/dev.js +++ b/common/dev/dev.js @@ -11,7 +11,6 @@ const testRefineStep = async (model) => { const refinedStep = await refineStep({ step: originalStep, failureMessage: "Element not found: .old-button-class", - model: model, context: { dom: ` diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index bc4f48e..c187bfa 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -10419,21 +10419,18 @@ }, "title": "OpenAI" }, - "localLlm": { + "ollama": { "type": "object", - "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "modelsDir": { + "baseUrl": { "type": "string", - "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." - }, - "defaultModel": { - "type": "string", - "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" } }, - "title": "Local LLM" + "title": "Ollama" }, "google": { "type": "object", diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index 16c5515..ba60461 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -10432,21 +10432,18 @@ }, "title": "OpenAI" }, - "localLlm": { + "ollama": { "type": "object", - "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "modelsDir": { + "baseUrl": { "type": "string", - "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." - }, - "defaultModel": { - "type": "string", - "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" } }, - "title": "Local LLM" + "title": "Ollama" }, "google": { "type": "object", diff --git a/common/package-lock.json b/common/package-lock.json index f24b869..8bf9649 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -19,7 +19,7 @@ "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "node-llama-cpp": "^3.9.0", + "ollama-ai-provider-v2": "^1.2.0", "yaml": "^2.8.2", "zod": "^4.1.13" }, @@ -181,15 +181,6 @@ "@types/json-schema": "^7.0.15" } }, - "node_modules/@huggingface/jinja": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.3.tgz", - "integrity": "sha512-asqfZ4GQS0hD876Uw4qiUb7Tr/V5Q+JZuo2L+BtdrD4U40QU58nIRq3ZSgAzJgT874VLjhGVacaYfrdpXtEvtA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -293,574 +284,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "license": "MIT" - }, - "node_modules/@node-llama-cpp/linux-arm64": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-arm64/-/linux-arm64-3.14.5.tgz", - "integrity": "sha512-58IcWW7EOqc/66mYWXRsoMCy1MR3pTX/YaC0HYF9Rg5XeAPKhUP7NHrglbqgjO62CkcuFZaSEiX2AtG972GQYQ==", - "cpu": [ - "arm64", - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/linux-armv7l": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-armv7l/-/linux-armv7l-3.14.5.tgz", - "integrity": "sha512-mJWN0qWsn8y+r/34DC3XlSiXjjKs6wX1BTx0wwJ37fWefS/qfzuBJwQGqpfqe5xpfafib/RgQX44fsvE/9yb1w==", - "cpu": [ - "arm", - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/linux-x64": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64/-/linux-x64-3.14.5.tgz", - "integrity": "sha512-f6xCqlSqSxMP9Iwm3CpaTzFybbHrzpLkNzA18v21PwhMN8u4DP44euLoxe+BMbOpyzx4iMxU1AUsPsgcHD1Y4w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/linux-x64-cuda": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-cuda/-/linux-x64-cuda-3.14.5.tgz", - "integrity": "sha512-yk0EGnAJ+m/paSaItigmxcqC8nNjZlkx9yZgQE51CsTip7tmnqqlj60pW1fWmhrjOJ9XnRlVVTP81fa9B+O1Hg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/linux-x64-cuda-ext": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-cuda-ext/-/linux-x64-cuda-ext-3.14.5.tgz", - "integrity": "sha512-AACXmXjqvAppoC6Z20UI7yeSZaFb6uP9x/2lzctVwlm42ef76SN6DNXaX1yzH7DTyzK5zYhoH4ycJUe+zOeGzw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/linux-x64-vulkan": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/linux-x64-vulkan/-/linux-x64-vulkan-3.14.5.tgz", - "integrity": "sha512-9wZG90CUyyO8EsqfDEh03/fK0ctbQFbKaAFa6Goh+jFLOtqPL+plLqAsW3jDFdLRF5+oAPTKt9/4Y7vHTajQbQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/mac-arm64-metal": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/mac-arm64-metal/-/mac-arm64-metal-3.14.5.tgz", - "integrity": "sha512-7pclj/nbQyx7gPVbyqkCn+ftlGcnw7YrewxBv1/BWWAMzBrMt2+qkjtUcUhwXH7mT5WN/+eWsszhIMXH3Uf6vQ==", - "cpu": [ - "arm64", - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/mac-x64": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/mac-x64/-/mac-x64-3.14.5.tgz", - "integrity": "sha512-iZBmLgPkLKiKS0lYAuqq8i85etGeQ9L+AjEJUhG5N6T/vCF4XSOkUTsEFMEX+iJLV3VxvY/C8R1e/UF7InUjUg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-arm64": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-arm64/-/win-arm64-3.14.5.tgz", - "integrity": "sha512-WTZJeb2JZo/qPNHf++xA2YeMXB46G7G4WsKEnHVyCpAhhslHAhe/LPgSQfNfk9rYusbsRiy9QMxeGNSOowZMVQ==", - "cpu": [ - "arm64", - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-x64": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64/-/win-x64-3.14.5.tgz", - "integrity": "sha512-cEuhb1iLTodM+V8xc1mWKeWRYkX9tlnl0+9jUjwsv2kgnAjEob3WlTYsCXewvEe2ShSyk8AsLsBPZxv7IQaBsw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-x64-cuda": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-cuda/-/win-x64-cuda-3.14.5.tgz", - "integrity": "sha512-gwBMSzUteLD765Gq/hYQ4UC21vggR7oG+DU4zAg0Mt3i34PqKJC+tBop5jsTN5Hq8RaM9+nTNrVbF/x228TLvg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-x64-cuda-ext": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-cuda-ext/-/win-x64-cuda-ext-3.14.5.tgz", - "integrity": "sha512-kBHnUmodr+n8N+sKTh1c6aNNEmvXBWM5AtaLWIEfkCb00bVHNFeqYPmLuPNtMX3dIUtD9PHdA4Jsn0RJmNZJfA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@node-llama-cpp/win-x64-vulkan": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/@node-llama-cpp/win-x64-vulkan/-/win-x64-vulkan-3.14.5.tgz", - "integrity": "sha512-rY+vr5RaGSCWEe22WZMkhUu16o9zpeqTZO/nD5G27Y0bb+xBRDLmXbxYMp2dDQTfpkNWIZ0ia3PGWwl5yhYw7A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@octokit/app": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/@octokit/app/-/app-16.1.2.tgz", - "integrity": "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==", - "license": "MIT", - "dependencies": { - "@octokit/auth-app": "^8.1.2", - "@octokit/auth-unauthenticated": "^7.0.3", - "@octokit/core": "^7.0.6", - "@octokit/oauth-app": "^8.0.3", - "@octokit/plugin-paginate-rest": "^14.0.0", - "@octokit/types": "^16.0.0", - "@octokit/webhooks": "^14.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/auth-app": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-8.1.2.tgz", - "integrity": "sha512-db8VO0PqXxfzI6GdjtgEFHY9tzqUql5xMFXYA12juq8TeTgPAuiiP3zid4h50lwlIP457p5+56PnJOgd2GGBuw==", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-app": "^9.0.3", - "@octokit/auth-oauth-user": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "toad-cache": "^3.7.0", - "universal-github-app-jwt": "^2.2.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/auth-oauth-app": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", - "integrity": "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-device": "^8.0.3", - "@octokit/auth-oauth-user": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/auth-oauth-device": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", - "integrity": "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==", - "license": "MIT", - "dependencies": { - "@octokit/oauth-methods": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/auth-oauth-user": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", - "integrity": "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-device": "^8.0.3", - "@octokit/oauth-methods": "^6.0.2", - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/auth-token": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", - "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", - "license": "MIT", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/auth-unauthenticated": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz", - "integrity": "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==", - "license": "MIT", - "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", - "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.3", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "before-after-hook": "^4.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/endpoint": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", - "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/graphql": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", - "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/oauth-app": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-8.0.3.tgz", - "integrity": "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-oauth-app": "^9.0.2", - "@octokit/auth-oauth-user": "^6.0.1", - "@octokit/auth-unauthenticated": "^7.0.2", - "@octokit/core": "^7.0.5", - "@octokit/oauth-authorization-url": "^8.0.0", - "@octokit/oauth-methods": "^6.0.1", - "@types/aws-lambda": "^8.10.83", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/oauth-authorization-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz", - "integrity": "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==", - "license": "MIT", - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/oauth-methods": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", - "integrity": "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==", - "license": "MIT", - "dependencies": { - "@octokit/oauth-authorization-url": "^8.0.0", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", - "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", - "license": "MIT" - }, - "node_modules/@octokit/openapi-webhooks-types": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.1.0.tgz", - "integrity": "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-graphql": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz", - "integrity": "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==", - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", - "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", - "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz", - "integrity": "sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==", - "license": "MIT", - "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": ">=7" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", - "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 20" - }, - "peerDependencies": { - "@octokit/core": "^7.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", - "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^11.0.2", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "fast-content-type-parse": "^3.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/request-error": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", - "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^16.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", - "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^27.0.0" - } - }, - "node_modules/@octokit/webhooks": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-14.2.0.tgz", - "integrity": "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-webhooks-types": "12.1.0", - "@octokit/request-error": "^7.0.0", - "@octokit/webhooks-methods": "^6.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/@octokit/webhooks-methods": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz", - "integrity": "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==", - "license": "MIT", - "engines": { - "node": ">= 20" - } - }, "node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -881,154 +304,6 @@ "node": ">=14" } }, - "node_modules/@reflink/reflink": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink/-/reflink-0.1.19.tgz", - "integrity": "sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@reflink/reflink-darwin-arm64": "0.1.19", - "@reflink/reflink-darwin-x64": "0.1.19", - "@reflink/reflink-linux-arm64-gnu": "0.1.19", - "@reflink/reflink-linux-arm64-musl": "0.1.19", - "@reflink/reflink-linux-x64-gnu": "0.1.19", - "@reflink/reflink-linux-x64-musl": "0.1.19", - "@reflink/reflink-win32-arm64-msvc": "0.1.19", - "@reflink/reflink-win32-x64-msvc": "0.1.19" - } - }, - "node_modules/@reflink/reflink-darwin-arm64": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-darwin-arm64/-/reflink-darwin-arm64-0.1.19.tgz", - "integrity": "sha512-ruy44Lpepdk1FqDz38vExBY/PVUsjxZA+chd9wozjUH9JjuDT/HEaQYA6wYN9mf041l0yLVar6BCZuWABJvHSA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-darwin-x64": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-darwin-x64/-/reflink-darwin-x64-0.1.19.tgz", - "integrity": "sha512-By85MSWrMZa+c26TcnAy8SDk0sTUkYlNnwknSchkhHpGXOtjNDUOxJE9oByBnGbeuIE1PiQsxDG3Ud+IVV9yuA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-linux-arm64-gnu": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-arm64-gnu/-/reflink-linux-arm64-gnu-0.1.19.tgz", - "integrity": "sha512-7P+er8+rP9iNeN+bfmccM4hTAaLP6PQJPKWSA4iSk2bNvo6KU6RyPgYeHxXmzNKzPVRcypZQTpFgstHam6maVg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-linux-arm64-musl": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-arm64-musl/-/reflink-linux-arm64-musl-0.1.19.tgz", - "integrity": "sha512-37iO/Dp6m5DDaC2sf3zPtx/hl9FV3Xze4xoYidrxxS9bgP3S8ALroxRK6xBG/1TtfXKTvolvp+IjrUU6ujIGmA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-linux-x64-gnu": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-x64-gnu/-/reflink-linux-x64-gnu-0.1.19.tgz", - "integrity": "sha512-jbI8jvuYCaA3MVUdu8vLoLAFqC+iNMpiSuLbxlAgg7x3K5bsS8nOpTRnkLF7vISJ+rVR8W+7ThXlXlUQ93ulkw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-linux-x64-musl": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-linux-x64-musl/-/reflink-linux-x64-musl-0.1.19.tgz", - "integrity": "sha512-e9FBWDe+lv7QKAwtKOt6A2W/fyy/aEEfr0g6j/hWzvQcrzHCsz07BNQYlNOjTfeytrtLU7k449H1PI95jA4OjQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-win32-arm64-msvc": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-win32-arm64-msvc/-/reflink-win32-arm64-msvc-0.1.19.tgz", - "integrity": "sha512-09PxnVIQcd+UOn4WAW73WU6PXL7DwGS6wPlkMhMg2zlHHG65F3vHepOw06HFCq+N42qkaNAc8AKIabWvtk6cIQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@reflink/reflink-win32-x64-msvc": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@reflink/reflink-win32-x64-msvc/-/reflink-win32-x64-msvc-0.1.19.tgz", - "integrity": "sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -1074,25 +349,6 @@ "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", "license": "MIT" }, - "node_modules/@tinyhttp/content-disposition": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@tinyhttp/content-disposition/-/content-disposition-2.2.2.tgz", - "integrity": "sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "funding": { - "type": "individual", - "url": "https://github.com/tinyhttp/tinyhttp?sponsor=1" - } - }, - "node_modules/@types/aws-lambda": { - "version": "8.10.159", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.159.tgz", - "integrity": "sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg==", - "license": "MIT" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1177,22 +433,11 @@ "ajv": "^8.8.2" } }, - "node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -1201,6 +446,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1211,41 +457,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "license": "MIT", - "dependencies": { - "retry": "0.13.1" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1266,20 +483,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", - "license": "Apache-2.0" - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { @@ -1298,15 +503,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1346,12 +542,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chmodrp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chmodrp/-/chmodrp-1.0.2.tgz", - "integrity": "sha512-TdngOlFV1FLTzU0o1w8MB6/BFywhtLC0SzRTGJU7T9lmdjlCWeMRt1iVo0Ki+ldwNk0BqNiKoc8xpLZEQ8mY1w==", - "license": "MIT" - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -1368,61 +558,11 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -1433,36 +573,11 @@ "node": ">=12" } }, - "node_modules/cmake-js": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.4.0.tgz", - "integrity": "sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==", - "license": "MIT", - "dependencies": { - "axios": "^1.6.5", - "debug": "^4", - "fs-extra": "^11.2.0", - "memory-stream": "^1.0.0", - "node-api-headers": "^1.1.0", - "npmlog": "^6.0.2", - "rc": "^1.2.7", - "semver": "^7.5.4", - "tar": "^6.2.0", - "url-join": "^4.0.1", - "which": "^2.0.2", - "yargs": "^17.7.2" - }, - "bin": { - "cmake-js": "bin/cmake-js" - }, - "engines": { - "node": ">= 14.15.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1473,16 +588,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1496,25 +603,11 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -1526,10 +619,10 @@ } }, "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, "dependencies": { "ms": "^2.1.3" }, @@ -1554,15 +647,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1572,12 +656,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -1612,16 +690,8 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/env-var": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/env-var/-/env-var-7.5.0.tgz", - "integrity": "sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA==", - "license": "MIT", - "engines": { - "node": ">=10" - } + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/es-define-property": { "version": "1.0.1", @@ -1672,17 +742,12 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, "node_modules/eventsource-parser": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", @@ -1692,22 +757,6 @@ "node": ">=18.0.0" } }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1729,33 +778,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/filename-reserved-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", - "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/filenamify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-6.0.0.tgz", - "integrity": "sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==", - "license": "MIT", - "dependencies": { - "filename-reserved-regex": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -1817,44 +839,6 @@ "node": ">= 6" } }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -1864,53 +848,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -1981,12 +928,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2023,12 +964,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -2050,169 +985,13 @@ "he": "bin/he" } }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/ipull": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/ipull/-/ipull-3.9.3.tgz", - "integrity": "sha512-ZMkxaopfwKHwmEuGDYx7giNBdLxbHbRCWcQVA1D2eqE4crUguupfxej6s7UqbidYEwT69dkyumYkY8DPHIxF9g==", - "license": "MIT", - "dependencies": { - "@tinyhttp/content-disposition": "^2.2.0", - "async-retry": "^1.3.3", - "chalk": "^5.3.0", - "ci-info": "^4.0.0", - "cli-spinners": "^2.9.2", - "commander": "^10.0.0", - "eventemitter3": "^5.0.1", - "filenamify": "^6.0.0", - "fs-extra": "^11.1.1", - "is-unicode-supported": "^2.0.0", - "lifecycle-utils": "^2.0.1", - "lodash.debounce": "^4.0.8", - "lowdb": "^7.0.1", - "pretty-bytes": "^6.1.0", - "pretty-ms": "^8.0.0", - "sleep-promise": "^9.1.0", - "slice-ansi": "^7.1.0", - "stdout-update": "^4.0.1", - "strip-ansi": "^7.1.0" - }, - "bin": { - "ipull": "dist/cli/cli.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/ido-pluto/ipull?sponsor=1" - }, - "optionalDependencies": { - "@reflink/reflink": "^0.1.16" - } - }, - "node_modules/ipull/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ipull/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ipull/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ipull/node_modules/lifecycle-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lifecycle-utils/-/lifecycle-utils-2.1.0.tgz", - "integrity": "sha512-AnrXnE2/OF9PHCyFg0RSqsnQTzV991XaZA/buhFDoc58xU7rhSCDgCz/09Lqpsn4MpoPHt7TRAXV1kWZypFVsA==", - "license": "MIT" - }, - "node_modules/ipull/node_modules/parse-ms": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", - "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ipull/node_modules/pretty-ms": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", - "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", - "license": "MIT", - "dependencies": { - "parse-ms": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ipull/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/is-path-inside": { @@ -2250,6 +1029,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/jackspeak": { @@ -2291,30 +1071,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lifecycle-utils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lifecycle-utils/-/lifecycle-utils-3.0.1.tgz", - "integrity": "sha512-Qt/Jl5dsNIsyCAZsHB6x3mbwHFn0HJbdmvF49sVX/bHgX2cW7+G+U+I67Zw+TPM1Sr21Gb2nfJMd2g6iUcI1EQ==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -2337,21 +1093,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lowdb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz", - "integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==", - "license": "MIT", - "dependencies": { - "steno": "^4.0.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -2368,15 +1109,6 @@ "node": ">= 0.4" } }, - "node_modules/memory-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", - "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.4.0" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2398,18 +1130,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -2426,15 +1146,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -2445,43 +1156,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mocha": { "version": "11.7.5", "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", @@ -2595,380 +1269,23 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/node-api-headers": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.7.0.tgz", - "integrity": "sha512-uJMGdkhVwu9+I3UsVvI3KW6ICAy/yDfsu5Br9rSnTtY3WpoaComXvKloiV5wtx0Md2rn0B9n29Ys2WMNwWxj9A==", - "license": "MIT" - }, - "node_modules/node-llama-cpp": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/node-llama-cpp/-/node-llama-cpp-3.14.5.tgz", - "integrity": "sha512-Db+RFqFMJOOVWprUINq77LVe44FaiJ6JvNiq14r2+DZRgkgyxckSZa6DcZ5Xe5MC+hGA5aqOdnNxsrudUcs74Q==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@huggingface/jinja": "^0.5.3", - "async-retry": "^1.3.3", - "bytes": "^3.1.2", - "chalk": "^5.4.1", - "chmodrp": "^1.0.2", - "cmake-js": "^7.4.0", - "cross-spawn": "^7.0.6", - "env-var": "^7.5.0", - "filenamify": "^6.0.0", - "fs-extra": "^11.3.0", - "ignore": "^7.0.4", - "ipull": "^3.9.2", - "is-unicode-supported": "^2.1.0", - "lifecycle-utils": "^3.0.1", - "log-symbols": "^7.0.0", - "nanoid": "^5.1.5", - "node-addon-api": "^8.3.1", - "octokit": "^5.0.3", - "ora": "^8.2.0", - "pretty-ms": "^9.2.0", - "proper-lockfile": "^4.1.2", - "semver": "^7.7.1", - "simple-git": "^3.27.0", - "slice-ansi": "^7.1.0", - "stdout-update": "^4.0.1", - "strip-ansi": "^7.1.0", - "validate-npm-package-name": "^6.0.0", - "which": "^5.0.0", - "yargs": "^17.7.2" - }, - "bin": { - "nlc": "dist/cli/cli.js", - "node-llama-cpp": "dist/cli/cli.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/giladgd" - }, - "optionalDependencies": { - "@node-llama-cpp/linux-arm64": "3.14.5", - "@node-llama-cpp/linux-armv7l": "3.14.5", - "@node-llama-cpp/linux-x64": "3.14.5", - "@node-llama-cpp/linux-x64-cuda": "3.14.5", - "@node-llama-cpp/linux-x64-cuda-ext": "3.14.5", - "@node-llama-cpp/linux-x64-vulkan": "3.14.5", - "@node-llama-cpp/mac-arm64-metal": "3.14.5", - "@node-llama-cpp/mac-x64": "3.14.5", - "@node-llama-cpp/win-arm64": "3.14.5", - "@node-llama-cpp/win-x64": "3.14.5", - "@node-llama-cpp/win-x64-cuda": "3.14.5", - "@node-llama-cpp/win-x64-cuda-ext": "3.14.5", - "@node-llama-cpp/win-x64-vulkan": "3.14.5" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/node-llama-cpp/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/node-llama-cpp/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/node-llama-cpp/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-llama-cpp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/node-llama-cpp/node_modules/log-symbols": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", - "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", - "license": "MIT", - "dependencies": { - "is-unicode-supported": "^2.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-llama-cpp/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/node-llama-cpp/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/octokit": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/octokit/-/octokit-5.0.5.tgz", - "integrity": "sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==", - "license": "MIT", - "dependencies": { - "@octokit/app": "^16.1.2", - "@octokit/core": "^7.0.6", - "@octokit/oauth-app": "^8.0.3", - "@octokit/plugin-paginate-graphql": "^6.0.0", - "@octokit/plugin-paginate-rest": "^14.0.0", - "@octokit/plugin-rest-endpoint-methods": "^17.0.0", - "@octokit/plugin-retry": "^8.0.3", - "@octokit/plugin-throttling": "^11.0.3", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "@octokit/webhooks": "^14.0.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", + "node_modules/ollama-ai-provider-v2": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/ollama-ai-provider-v2/-/ollama-ai-provider-v2-1.5.5.tgz", + "integrity": "sha512-1YwTFdPjhPNHny/DrOHO+s8oVGGIE5Jib61/KnnjPRNWQhVVimrJJdaAX3e6nNRRDXrY5zbb9cfm2+yVvgsrqw==", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^6.0.1" + "@ai-sdk/provider": "^2.0.0", + "@ai-sdk/provider-utils": "^3.0.17" }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "zod": "^4.0.16" } }, "node_modules/p-limit": { @@ -2993,18 +1310,6 @@ "dev": true, "license": "BlueOak-1.0.0" }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3018,6 +1323,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3047,59 +1353,6 @@ "dev": true, "license": "ISC" }, - "node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "license": "MIT", - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", - "license": "MIT", - "dependencies": { - "parse-ms": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/proper-lockfile/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3114,44 +1367,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -3170,6 +1385,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3183,35 +1399,11 @@ "node": ">=0.10.0" } }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -3227,18 +1419,6 @@ } ] }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -3248,16 +1428,11 @@ "randombytes": "^2.1.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -3270,6 +1445,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3279,6 +1455,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -3287,21 +1464,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-git": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", - "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", - "license": "MIT", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, "node_modules/sinon": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-21.0.0.tgz", @@ -3320,169 +1482,11 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/sleep-promise": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-9.1.0.tgz", - "integrity": "sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==", - "license": "MIT" - }, - "node_modules/slice-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stdout-update": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/stdout-update/-/stdout-update-4.0.1.tgz", - "integrity": "sha512-wiS21Jthlvl1to+oorePvcyrIkiG/6M3D3VTmDUlJm7Cy6SbFhKkAvX+YBuHLxck/tO3mrdpC/cNesigQc3+UQ==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^6.2.0", - "ansi-styles": "^6.2.1", - "string-width": "^7.1.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/stdout-update/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/stdout-update/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/stdout-update/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/stdout-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stdout-update/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/steno": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz", - "integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3512,6 +1516,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3557,41 +1562,6 @@ "node": ">=8" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/toad-cache": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", - "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -3601,52 +1571,11 @@ "node": ">=4" } }, - "node_modules/universal-github-app-jwt": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz", - "integrity": "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==", - "license": "MIT" - }, - "node_modules/universal-user-agent": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", - "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", - "license": "ISC" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -3658,15 +1587,6 @@ "node": ">= 8" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/workerpool": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", @@ -3678,6 +1598,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -3714,17 +1635,12 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/yaml": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", @@ -3744,6 +1660,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -3762,6 +1679,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -3806,18 +1724,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", diff --git a/common/package.json b/common/package.json index 1cde895..bab8fed 100644 --- a/common/package.json +++ b/common/package.json @@ -28,6 +28,7 @@ "@ai-sdk/anthropic": "^2.0.54", "@ai-sdk/google": "^3.0.0-beta.72", "@ai-sdk/openai": "^2.0.80", + "ollama-ai-provider-v2": "^1.2.0", "@apidevtools/json-schema-ref-parser": "^15.1.3", "ai": "^5.0.109", "ajv": "^8.17.1", @@ -35,7 +36,6 @@ "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", "axios": "^1.13.2", - "node-llama-cpp": "^3.9.0", "yaml": "^2.8.2", "zod": "^4.1.13" } diff --git a/common/src/ai.js b/common/src/ai.js index 48cc2e0..17b6b13 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -2,17 +2,14 @@ const { generateText, generateObject, jsonSchema } = require("ai"); const { createOpenAI } = require("@ai-sdk/openai"); const { createAnthropic } = require("@ai-sdk/anthropic"); const { createGoogleGenerativeAI } = require("@ai-sdk/google"); +const { createOllama } = require("ollama-ai-provider-v2"); const { z } = require("zod"); const Ajv = require("ajv"); const addFormats = require("ajv-formats"); -const { - isLocalLlmAvailable, - generateWithLocalLlm, - DEFAULT_LOCAL_MODEL, - DEFAULT_LOCAL_MODEL_SMALL, -} = require("./localLlm"); - -const DEFAULT_MODEL = "local/qwen3-vl:2b"; + +const DEFAULT_MODEL = "ollama/qwen3-vl:2b"; +const OLLAMA_AVAILABILITY_TIMEOUT_MS = 500; +const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434/api"; const MAX_SCHEMA_VALIDATION_RETRIES = 3; /** @@ -31,13 +28,36 @@ const modelMap = { "google/gemini-2.5-flash": "gemini-2.5-flash", "google/gemini-2.5-pro": "gemini-2.5-pro", "google/gemini-3-pro": "gemini-3-pro-preview", - // Local models (node-llama-cpp with GGUF files) - "local/qwen3-vl:8b": "hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL", - "local/qwen3-vl:2b": "hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M", + // Ollama models + "ollama/qwen3-vl:8b": "hf.co/unsloth/Qwen3-VL-8B-Instruct-GGUF:UD-Q4_K_XL", + "ollama/qwen3-vl:2b": "hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M", }; -const getDefaultProvider = async (config = {}) => { - const localLlmConfig = config?.integrations?.localLlm; +/** + * Checks if Ollama is available at localhost:11434. + * @param {string} [baseUrl] - Optional base URL override. + * @returns {Promise} True if Ollama is available. + */ +const isOllamaAvailable = async (baseUrl) => { + const url = baseUrl || "http://localhost:11434"; + try { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), OLLAMA_AVAILABILITY_TIMEOUT_MS); + + const response = await fetch(url, { + method: "GET", + signal: controller.signal, + }); + + clearTimeout(timeoutId); + return response.ok; + } catch { + return false; + } +}; + +const getDefaultProvider = async (config = {}) => { + const ollamaBaseUrl = config?.integrations?.ollama?.baseUrl; // Try to detect from environment variables if no model is provided if (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) { return { @@ -57,14 +77,13 @@ const getDefaultProvider = async (config = {}) => { model: "gemini-2.5-flash", apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google.apiKey, }; - } else if (await isLocalLlmAvailable()) { - // Local LLM via node-llama-cpp, no API key needed + } else if (await isOllamaAvailable(ollamaBaseUrl)) { + // Local, no API key needed return { - provider: "local", - model: localLlmConfig?.defaultModel || modelMap["local/qwen3-vl:8b"], - modelUri: localLlmConfig?.defaultModel || modelMap["local/qwen3-vl:8b"], - modelsDir: localLlmConfig?.modelsDir, + provider: "ollama", + model: modelMap["ollama/qwen3-vl:8b"], apiKey: null, + baseURL: ollamaBaseUrl || DEFAULT_OLLAMA_BASE_URL, }; } else { return { provider: null, model: null, apiKey: null }; @@ -75,21 +94,15 @@ const getDefaultProvider = async (config = {}) => { * Detects the provider, model, and API from a model string and environment variables. * @param {Object} config - The Doc Detective configuration object. * @param {string} model - The model identifier. - * @returns {Promise<{ provider: "openai" | "anthropic" | "google" | "local" | null, model: string | null, apiKey: string | null, modelUri?: string, modelsDir?: string }>} The detected provider, model, and API key. + * @returns {Promise<{ provider: "openai" | "anthropic" | "ollama" | null, model: string | null, apiKey: string | null, baseURL?: string }>} The detected provider, model, and API key. */ const detectProvider = async (config, model) => { const detectedModel = modelMap[model] || null; if (!detectedModel) return getDefaultProvider(config); - if (model.startsWith("local/")) { - const localLlmConfig = config?.integrations?.localLlm; - return { - provider: "local", - model: detectedModel, - modelUri: detectedModel, - modelsDir: localLlmConfig?.modelsDir, - apiKey: null, - }; + if (model.startsWith("ollama/")) { + const ollamaBaseUrl = config.integrations?.ollama?.baseUrl || DEFAULT_OLLAMA_BASE_URL; + return { provider: "ollama", model: detectedModel, apiKey: null, baseURL: ollamaBaseUrl }; } if (model.startsWith("anthropic/") && (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic)) { @@ -112,17 +125,17 @@ const detectProvider = async (config, model) => { /** * Creates a provider instance based on the provider name. - * Note: For "local" provider, this returns null as local LLM uses a different generation path. * @param {Object} options - * @param {"openai" | "anthropic" | "google" | "local"} options.provider - The provider name. + * @param {"openai" | "anthropic" | "ollama"} options.provider - The provider name. * @param {string} [options.apiKey] - Optional API key override. * @param {string} [options.baseURL] - Optional base URL override. - * @returns {Function | null} The provider factory function, or null for local provider. + * @returns {Function} The provider factory function. */ const createProvider = ({ provider, apiKey, baseURL }) => { - if (provider === "local") { - // Local LLM uses generateWithLocalLlm directly, not the AI SDK provider pattern - return null; + if (provider === "ollama") { + const options = {}; + if (baseURL) options.baseURL = baseURL; + return createOllama(options); } if (provider === "openai") { @@ -393,26 +406,11 @@ const generate = async ({ if (!detected.provider) { throw new Error( - `Cannot determine provider for model "${model}". Please specify a 'provider' option ("openai", "anthropic", "google", or "local").` + `Cannot determine provider for model "${model}". Please specify a 'provider' option ("openai" or "anthropic").` ); } - // Handle local LLM provider separately - if (detected.provider === "local") { - return generateWithLocalLlm({ - prompt, - messages, - files, - modelUri: detected.modelUri, - modelsDir: detected.modelsDir, - system, - schema, - temperature, - maxTokens, - }); - } - - // Create provider instance for cloud providers + // Create provider instance const providerFactory = createProvider({ provider: detected.provider, apiKey: detected.apiKey, @@ -619,7 +617,7 @@ module.exports = { generate, detectProvider, getApiKey, - isLocalLlmAvailable, + isOllamaAvailable, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, diff --git a/common/src/index.js b/common/src/index.js index 646bca3..eab5c17 100644 --- a/common/src/index.js +++ b/common/src/index.js @@ -2,19 +2,19 @@ const { schemas } = require("./schemas"); const { validate, transformToSchemaKey } = require("./validate"); const { resolvePaths } = require("./resolvePaths"); const { readFile } = require("./files"); -const { generate, detectProvider, getApiKey, isLocalLlmAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); +const { generate, detectProvider, getApiKey, isOllamaAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); const { refineStep } = require("./refineStep"); const { - DEFAULT_LOCAL_MODEL, - DEFAULT_LOCAL_MODEL_SMALL, - MODEL_DOWNLOAD_TIMEOUT_MS, - getModelsDir, - ensureModelAvailable, - loadModel, - createLocalSession, - generateWithLocalLlm, - disposeLocalLlm, -} = require("./localLlm"); + DEFAULT_OLLAMA_MODEL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + detectGpuType, + startOllamaContainer, + waitForOllama, + pullOllamaModel, + stopOllamaContainer, + ensureOllamaRunning, +} = require("./ollama"); module.exports = { schemas, @@ -25,17 +25,17 @@ module.exports = { generate, detectProvider, getApiKey, - isLocalLlmAvailable, + isOllamaAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, refineStep, - DEFAULT_LOCAL_MODEL, - DEFAULT_LOCAL_MODEL_SMALL, - MODEL_DOWNLOAD_TIMEOUT_MS, - getModelsDir, - ensureModelAvailable, - loadModel, - createLocalSession, - generateWithLocalLlm, - disposeLocalLlm, + DEFAULT_OLLAMA_MODEL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + detectGpuType, + startOllamaContainer, + waitForOllama, + pullOllamaModel, + stopOllamaContainer, + ensureOllamaRunning, }; diff --git a/common/src/localLlm.js b/common/src/localLlm.js deleted file mode 100644 index 5630c37..0000000 --- a/common/src/localLlm.js +++ /dev/null @@ -1,341 +0,0 @@ -const fs = require("fs"); -const os = require("os"); -const path = require("path"); - -/** Default local model URI (Qwen3-VL 8B for multimodal support) */ -const DEFAULT_LOCAL_MODEL = "hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL"; - -/** Smaller model for testing */ -const DEFAULT_LOCAL_MODEL_SMALL = "hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"; - -/** Maximum time to wait for model download (15 minutes) */ -const MODEL_DOWNLOAD_TIMEOUT_MS = 15 * 60 * 1000; - -/** Cached llama instance for reuse */ -let cachedLlama = null; - -/** Cached model instances by path */ -const cachedModels = new Map(); - -/** Cached sessions by model path */ -const cachedSessions = new Map(); - -/** - * Gets the models directory path, creating it if it doesn't exist. - * @param {string} [customDir] - Optional custom directory override. - * @returns {string} The models directory path. - */ -const getModelsDir = (customDir) => { - const modelsDir = customDir || path.join(os.tmpdir(), "doc-detective", "models"); - - if (!fs.existsSync(modelsDir)) { - fs.mkdirSync(modelsDir, { recursive: true }); - } - - return modelsDir; -}; - -/** - * Dynamically imports node-llama-cpp (ESM module). - * @returns {Promise} The node-llama-cpp module. - */ -const importNodeLlamaCpp = async () => { - return import("node-llama-cpp"); -}; - -/** - * Gets or creates a cached Llama instance. - * @returns {Promise} The Llama instance. - */ -const getLlamaInstance = async () => { - if (cachedLlama) { - return cachedLlama; - } - - const { getLlama } = await importNodeLlamaCpp(); - cachedLlama = await getLlama(); - return cachedLlama; -}; - -/** - * Checks if the local LLM is available (node-llama-cpp can initialize). - * @returns {Promise} True if local LLM is available. - */ -const isLocalLlmAvailable = async () => { - try { - await getLlamaInstance(); - return true; - } catch { - return false; - } -}; - -/** - * Ensures a model is available locally, downloading if necessary. - * @param {string} [modelUri=DEFAULT_LOCAL_MODEL] - The model URI (e.g., "hf:user/model:quant"). - * @param {string} [modelsDir] - Optional custom models directory. - * @returns {Promise} The local path to the model file. - */ -const ensureModelAvailable = async (modelUri = DEFAULT_LOCAL_MODEL, modelsDir) => { - const { resolveModelFile } = await importNodeLlamaCpp(); - const dir = getModelsDir(modelsDir); - - console.log(` Ensuring model available: ${modelUri}`); - console.log(` Models directory: ${dir}`); - - const modelPath = await resolveModelFile(modelUri, dir, { - cli: true, // Show download progress in console - }); - - console.log(` Model ready at: ${modelPath}`); - return modelPath; -}; - -/** - * Loads a model from the given path, using cache if available. - * @param {string} modelPath - The path to the model file. - * @returns {Promise} The loaded model instance. - */ -const loadModel = async (modelPath) => { - if (cachedModels.has(modelPath)) { - return cachedModels.get(modelPath); - } - - const llama = await getLlamaInstance(); - const model = await llama.loadModel({ modelPath }); - cachedModels.set(modelPath, model); - return model; -}; - -/** - * Creates a chat session for the given model. - * @param {string} modelPath - The path to the model file. - * @returns {Promise} An object with session and related utilities. - */ -const createLocalSession = async (modelPath) => { - if (cachedSessions.has(modelPath)) { - return cachedSessions.get(modelPath); - } - - const { LlamaChatSession } = await importNodeLlamaCpp(); - const model = await loadModel(modelPath); - const context = await model.createContext(); - const session = new LlamaChatSession({ - contextSequence: context.getSequence(), - }); - - const sessionData = { model, context, session }; - cachedSessions.set(modelPath, sessionData); - return sessionData; -}; - -/** - * Converts a file object to the format expected by node-llama-cpp for multimodal input. - * @param {Object} llama - The Llama instance. - * @param {Object} file - The file object. - * @param {string} file.type - The file type (e.g., "image"). - * @param {string | Buffer | Uint8Array} file.data - Base64 string, URL, Buffer, or Uint8Array. - * @param {string} [file.mimeType] - The MIME type (e.g., "image/png"). - * @returns {Promise} The image object for node-llama-cpp. - */ -const fileToLlamaImage = async (llama, file) => { - if (file.type !== "image") { - throw new Error(`Unsupported file type: ${file.type}. Only "image" is supported.`); - } - - // Convert data to Buffer if needed - let imageBuffer; - if (Buffer.isBuffer(file.data)) { - imageBuffer = file.data; - } else if (file.data instanceof Uint8Array) { - imageBuffer = Buffer.from(file.data); - } else if (typeof file.data === "string") { - if (file.data.startsWith("http://") || file.data.startsWith("https://")) { - // URL - fetch and convert to buffer - const response = await fetch(file.data); - const arrayBuffer = await response.arrayBuffer(); - imageBuffer = Buffer.from(arrayBuffer); - } else { - // Assume base64 - imageBuffer = Buffer.from(file.data, "base64"); - } - } else { - throw new Error("Unsupported image data format"); - } - - // Create image using llama's createImage helper if available - // For now, return buffer that can be used with vision models - return { type: "image", data: imageBuffer }; -}; - -/** - * Generates text or structured output using a local LLM. - * @param {Object} options - Generation options. - * @param {string} [options.prompt] - The text prompt. - * @param {Array} [options.messages] - Array of messages for conversation. - * @param {Array} [options.files] - Array of file objects (e.g., images for multimodal). - * @param {string} [options.modelPath] - Path to the model file. - * @param {string} [options.modelUri] - Model URI to download if modelPath not provided. - * @param {string} [options.system] - System message. - * @param {Object} [options.schema] - JSON schema for structured output. - * @param {string} [options.modelsDir] - Custom models directory. - * @param {number} [options.temperature] - Temperature for generation. - * @param {number} [options.maxTokens] - Maximum tokens to generate. - * @returns {Promise} Generation result with text or object. - */ -const generateWithLocalLlm = async ({ - prompt, - messages, - files, - modelPath, - modelUri = DEFAULT_LOCAL_MODEL, - system, - schema, - modelsDir, - temperature, - maxTokens, -}) => { - // Ensure model is available - const resolvedModelPath = modelPath || await ensureModelAvailable(modelUri, modelsDir); - - // Create session - const { session, model } = await createLocalSession(resolvedModelPath); - const llama = await getLlamaInstance(); - - // Build the prompt from messages if provided - let finalPrompt = prompt || ""; - if (messages && messages.length > 0) { - // Extract the last user message as the prompt - const lastUserMessage = messages.filter(m => m.role === "user").pop(); - if (lastUserMessage) { - finalPrompt = lastUserMessage.content; - } - } - - // Add system message prefix if provided - if (system && finalPrompt) { - finalPrompt = `${system}\n\n${finalPrompt}`; - } - - // Build prompt options - const promptOptions = {}; - - if (temperature !== undefined) { - promptOptions.temperature = temperature; - } - - if (maxTokens !== undefined) { - promptOptions.maxTokens = maxTokens; - } - - // Handle multimodal input (images) - if (files && files.length > 0) { - const images = []; - for (const file of files) { - if (file.type === "image") { - const llamaImage = await fileToLlamaImage(llama, file); - images.push(llamaImage); - } - } - if (images.length > 0) { - // Note: The exact API for passing images may vary based on node-llama-cpp version - // This is a placeholder for the multimodal handling - promptOptions.images = images; - } - } - - // Handle structured output with JSON schema - if (schema) { - try { - const grammar = await llama.createGrammarForJsonSchema(schema); - promptOptions.grammar = grammar; - - const response = await session.prompt(finalPrompt, promptOptions); - const parsedObject = grammar.parse(response); - - return { - object: parsedObject, - usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, // Token tracking not easily available - finishReason: "stop", - }; - } catch (grammarError) { - // If grammar creation fails, try without grammar and parse manually - console.warn("Grammar creation failed, attempting without structured output:", grammarError.message); - const response = await session.prompt(finalPrompt, promptOptions); - - try { - const parsedObject = JSON.parse(response); - return { - object: parsedObject, - usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, - finishReason: "stop", - }; - } catch { - throw new Error(`Failed to generate structured output: ${grammarError.message}`); - } - } - } - - // Generate text response - const response = await session.prompt(finalPrompt, promptOptions); - - return { - text: response, - usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 }, - finishReason: "stop", - }; -}; - -/** - * Disposes of cached resources (models, sessions, llama instance). - * Call this when done with local LLM to free memory. - * @returns {Promise} - */ -const disposeLocalLlm = async () => { - // Dispose sessions - for (const [, { session, context }] of cachedSessions) { - try { - if (context && typeof context.dispose === "function") { - await context.dispose(); - } - } catch { - // Ignore disposal errors - } - } - cachedSessions.clear(); - - // Dispose models - for (const [, model] of cachedModels) { - try { - if (model && typeof model.dispose === "function") { - await model.dispose(); - } - } catch { - // Ignore disposal errors - } - } - cachedModels.clear(); - - // Dispose llama instance - if (cachedLlama && typeof cachedLlama.dispose === "function") { - try { - await cachedLlama.dispose(); - } catch { - // Ignore disposal errors - } - } - cachedLlama = null; -}; - -module.exports = { - DEFAULT_LOCAL_MODEL, - DEFAULT_LOCAL_MODEL_SMALL, - MODEL_DOWNLOAD_TIMEOUT_MS, - getModelsDir, - isLocalLlmAvailable, - ensureModelAvailable, - loadModel, - createLocalSession, - generateWithLocalLlm, - disposeLocalLlm, -}; diff --git a/common/src/ollama.js b/common/src/ollama.js new file mode 100644 index 0000000..42217aa --- /dev/null +++ b/common/src/ollama.js @@ -0,0 +1,198 @@ +const { execSync, spawn } = require("child_process"); +const fs = require("fs"); +const { isOllamaAvailable, modelMap } = require("./ai"); + +/** Default Ollama model to use */ +const DEFAULT_OLLAMA_MODEL = modelMap["ollama/qwen3-vl:8b"]; + +/** Maximum time to wait for model pull (10 minutes) */ +const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; + +/** Maximum time to wait for Ollama startup (30 seconds) */ +const OLLAMA_STARTUP_TIMEOUT_MS = 30 * 1000; + +/** + * Detects available GPU type. + * @returns {"nvidia" | "amd" | "none"} The GPU type. + */ +const detectGpuType = () => { + // Check for Nvidia GPU + try { + execSync("nvidia-smi", { stdio: "ignore" }); + return "nvidia"; + } catch { + // nvidia-smi not available or failed + } + + // Check for AMD GPU + try { + if (fs.existsSync("/dev/kfd") && fs.existsSync("/dev/dri")) { + return "amd"; + } + } catch { + // fs check failed + } + + return "none"; +}; + +/** + * Starts the Ollama Docker container with appropriate GPU support. + * @returns {Promise} + */ +const startOllamaContainer = async () => { + const gpuType = detectGpuType(); + console.log(` Detected GPU type: ${gpuType}`); + + let dockerArgs; + switch (gpuType) { + case "nvidia": + dockerArgs = [ + "run", "-d", + "--gpus=all", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama" + ]; + break; + case "amd": + dockerArgs = [ + "run", "-d", + "--device", "/dev/kfd", + "--device", "/dev/dri", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama:rocm" + ]; + break; + default: + dockerArgs = [ + "run", "-d", + "-v", "ollama:/root/.ollama", + "-p", "11434:11434", + "--name", "ollama", + "ollama/ollama" + ]; + } + + console.log(` Starting Ollama container...`); + execSync(`docker ${dockerArgs.join(" ")}`, { stdio: "inherit" }); +}; + +/** + * Waits for Ollama to become available. + * @param {number} [timeoutMs=OLLAMA_STARTUP_TIMEOUT_MS] - Maximum time to wait. + * @returns {Promise} True if Ollama became available. + */ +const waitForOllama = async (timeoutMs = OLLAMA_STARTUP_TIMEOUT_MS) => { + const startTime = Date.now(); + + while (Date.now() - startTime < timeoutMs) { + try { + const response = await fetch("http://localhost:11434"); + if (response.ok) { + return true; + } + } catch { + // Not ready yet + } + await new Promise(resolve => setTimeout(resolve, 1000)); + } + + return false; +}; + +/** + * Pulls the specified Ollama model with progress output. + * @param {string} [model=DEFAULT_OLLAMA_MODEL] - The model to pull. + * @returns {Promise} + */ +const pullOllamaModel = async (model = DEFAULT_OLLAMA_MODEL) => { + console.log(` Pulling ${model} model (this may take up to 10 minutes on first run)...`); + + return new Promise((resolve, reject) => { + const pullProcess = spawn("docker", ["exec", "ollama", "ollama", "pull", model], { + stdio: "inherit" + }); + + const timeoutId = setTimeout(() => { + pullProcess.kill(); + reject(new Error("Model pull timed out after 10 minutes")); + }, MODEL_PULL_TIMEOUT_MS); + + pullProcess.on("close", (code) => { + clearTimeout(timeoutId); + if (code === 0) { + console.log(` Model ${model} is ready.`); + resolve(); + } else { + reject(new Error(`Model pull failed with exit code ${code}`)); + } + }); + + pullProcess.on("error", (err) => { + clearTimeout(timeoutId); + reject(err); + }); + }); +}; + +/** + * Stops and removes the Ollama container. + * @returns {Promise} + */ +const stopOllamaContainer = async () => { + try { + console.log(` Stopping Ollama container...`); + execSync("docker stop ollama", { stdio: "ignore" }); + } catch { + // Container may not be running + } + try { + execSync("docker rm ollama", { stdio: "ignore" }); + console.log(` Ollama container removed.`); + } catch { + // Container may not exist + } +}; + +/** + * Ensures Ollama is running, starting a Docker container if needed. + * @param {string} [model=DEFAULT_OLLAMA_MODEL] - The model to ensure is available. + * @returns {Promise} True if Ollama is available. + */ +const ensureOllamaRunning = async (model = DEFAULT_OLLAMA_MODEL) => { + if (await isOllamaAvailable()) { + console.log(" Ollama is already running."); + return true; + } + + console.log(" Ollama not detected, starting Docker container..."); + + // Clean up any existing container first + await stopOllamaContainer(); + + await startOllamaContainer(); + + const available = await waitForOllama(); + if (!available) { + throw new Error("Ollama container started but did not become available"); + } + + await pullOllamaModel(model); + return true; +}; + +module.exports = { + DEFAULT_OLLAMA_MODEL, + MODEL_PULL_TIMEOUT_MS, + OLLAMA_STARTUP_TIMEOUT_MS, + detectGpuType, + startOllamaContainer, + waitForOllama, + pullOllamaModel, + stopOllamaContainer, + ensureOllamaRunning, +}; diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index bc4f48e..c187bfa 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -10419,21 +10419,18 @@ }, "title": "OpenAI" }, - "localLlm": { + "ollama": { "type": "object", - "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "modelsDir": { + "baseUrl": { "type": "string", - "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." - }, - "defaultModel": { - "type": "string", - "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" } }, - "title": "Local LLM" + "title": "Ollama" }, "google": { "type": "object", diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index 16c5515..ba60461 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -10432,21 +10432,18 @@ }, "title": "OpenAI" }, - "localLlm": { + "ollama": { "type": "object", - "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "modelsDir": { + "baseUrl": { "type": "string", - "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." - }, - "defaultModel": { - "type": "string", - "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" } }, - "title": "Local LLM" + "title": "Ollama" }, "google": { "type": "object", diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index c2e970a..c4d37af 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -10817,21 +10817,18 @@ }, "title": "OpenAI" }, - "localLlm": { + "ollama": { "type": "object", - "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "modelsDir": { + "baseUrl": { "type": "string", - "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." - }, - "defaultModel": { - "type": "string", - "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" } }, - "title": "Local LLM" + "title": "Ollama" }, "google": { "type": "object", @@ -34994,21 +34991,18 @@ }, "title": "OpenAI" }, - "localLlm": { + "ollama": { "type": "object", - "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "modelsDir": { - "type": "string", - "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." - }, - "defaultModel": { + "baseUrl": { "type": "string", - "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" } }, - "title": "Local LLM" + "title": "Ollama" }, "google": { "type": "object", diff --git a/common/src/schemas/src_schemas/config_v3.schema.json b/common/src/schemas/src_schemas/config_v3.schema.json index 5247a18..3858229 100644 --- a/common/src/schemas/src_schemas/config_v3.schema.json +++ b/common/src/schemas/src_schemas/config_v3.schema.json @@ -247,21 +247,18 @@ }, "title": "OpenAI" }, - "localLlm": { + "ollama": { "type": "object", - "description": "Configuration for local LLM integration using node-llama-cpp. Runs locally and doesn't need an API key.", + "description": "Configuration for Ollama integration. Ollama runs locally and doesn't need an API key.", "additionalProperties": false, "properties": { - "modelsDir": { + "baseUrl": { "type": "string", - "description": "Directory to store downloaded GGUF model files. Defaults to the system temp directory." - }, - "defaultModel": { - "type": "string", - "description": "Default model URI to use (e.g., 'hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL'). If not specified, uses the built-in default." + "description": "Base URL for the Ollama API.", + "default": "http://localhost:11434/api" } }, - "title": "Local LLM" + "title": "Ollama" }, "google": { "type": "object", diff --git a/common/test/ai.test.js b/common/test/ai.test.js index ab3541e..ddfb070 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -1,11 +1,13 @@ const { z } = require("zod"); const { - ensureModelAvailable, - disposeLocalLlm, - MODEL_DOWNLOAD_TIMEOUT_MS, - DEFAULT_LOCAL_MODEL_SMALL, -} = require("../src/localLlm"); + ensureOllamaRunning, + stopOllamaContainer, + MODEL_PULL_TIMEOUT_MS, +} = require("../src/ollama"); + +// Track if we started the container +let weStartedOllama = false; // Import chai using dynamic import (needed for ESM) let expect; @@ -15,35 +17,33 @@ const { generate, detectProvider, getApiKey, - isLocalLlmAvailable, + isOllamaAvailable, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, } = require("../src/ai"); describe("AI Module", function () { - // Increase timeout for real API calls and model download - this.timeout(MODEL_DOWNLOAD_TIMEOUT_MS + 120000); + // Increase timeout for real API calls and container setup + this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); before(async function () { // Dynamic import for chai ESM const chai = await import("chai"); expect = chai.expect; - console.log(" Setting up local LLM for tests..."); - // Ensure the model is downloaded before running tests - try { - await ensureModelAvailable(DEFAULT_LOCAL_MODEL_SMALL); - console.log(" Local LLM model ready."); - } catch (error) { - console.log(" Warning: Could not set up local LLM:", error.message); - console.log(" Some tests will be skipped."); - } + console.log(" Setting up Ollama for tests..."); + // Track if we need to start the container + const wasAlreadyRunning = await isOllamaAvailable(); + await ensureOllamaRunning(); + weStartedOllama = !wasAlreadyRunning; }); after(async function () { - console.log(" Cleaning up local LLM resources..."); - await disposeLocalLlm(); + if (weStartedOllama) { + console.log(" Cleaning up Ollama container..."); + await stopOllamaContainer(); + } }); describe("modelMap", function () { @@ -59,9 +59,9 @@ describe("AI Module", function () { expect(modelMap["openai/gpt-5-nano"]).to.equal("gpt-5-nano"); }); - it("should contain local model mappings", function () { - expect(modelMap["local/qwen3-vl:2b"]).to.equal("hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); - expect(modelMap["local/qwen3-vl:8b"]).to.equal("hf:unsloth/Qwen3-VL-8B-Instruct-GGUF:Q4_K_XL"); + it("should contain Ollama model mappings", function () { + expect(modelMap["ollama/qwen3-vl:2b"]).to.equal("hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); + expect(modelMap["ollama/qwen3-vl:8b"]).to.equal("hf.co/unsloth/Qwen3-VL-8B-Instruct-GGUF:UD-Q4_K_XL"); }); it("should contain Google Gemini model mappings", function () { @@ -106,20 +106,20 @@ describe("AI Module", function () { } }); - it("should detect local provider for known local models", async function () { + it("should detect Ollama provider for known Ollama models", async function () { const config = {}; - const result = await detectProvider(config, "local/qwen3-vl:2b"); - expect(result.provider).to.equal("local"); - expect(result.model).to.equal("hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); - expect(result.modelUri).to.equal("hf:unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); + const result = await detectProvider(config, "ollama/qwen3-vl:2b"); + expect(result.provider).to.equal("ollama"); + expect(result.model).to.equal("hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); expect(result.apiKey).to.be.null; + expect(result.baseURL).to.equal("http://localhost:11434/api"); }); - it("should use custom modelsDir from config for local provider", async function () { - const config = { integrations: { localLlm: { modelsDir: "/custom/models/dir" } } }; - const result = await detectProvider(config, "local/qwen3-vl:2b"); - expect(result.provider).to.equal("local"); - expect(result.modelsDir).to.equal("/custom/models/dir"); + it("should use custom baseUrl from config for Ollama", async function () { + const config = { integrations: { ollama: { baseUrl: "http://custom:11434/api" } } }; + const result = await detectProvider(config, "ollama/qwen3-vl:2b"); + expect(result.provider).to.equal("ollama"); + expect(result.baseURL).to.equal("http://custom:11434/api"); }); it("should detect Anthropic provider and mapped model for known Anthropic models with config API key", async function () { @@ -221,16 +221,12 @@ describe("AI Module", function () { expect((await detectProvider(config, "anthropic/claude-haiku-4.5")).apiKey).to.equal("sk-ant-env"); }); - it("should fall back to local provider as default when available", async function () { + it("should fall back to Ollama as default provider when available", async function () { const config = {}; const result = await detectProvider(config, "unknown-model"); - // Local LLM should be preferred when available - if (await isLocalLlmAvailable()) { - expect(result.provider).to.equal("local"); - expect(result.modelUri).to.be.a("string"); - } else { - expect(result.provider).to.be.null; - } + // Ollama should be preferred when available + expect(result.provider).to.equal("ollama"); + expect(result.model).to.equal("qwen3-vl:2b"); }); it("should return null values when model is known but no API key for that provider", async function () { @@ -244,8 +240,8 @@ describe("AI Module", function () { }); describe("DEFAULT_MODEL", function () { - it("should be local/qwen3-vl:2b", function () { - expect(DEFAULT_MODEL).to.equal("local/qwen3-vl:2b"); + it("should be ollama/qwen3-vl:2b", function () { + expect(DEFAULT_MODEL).to.equal("ollama/qwen3-vl:2b"); }); }); @@ -275,9 +271,9 @@ describe("AI Module", function () { } }); - it("should throw error when provider cannot be determined and local LLM not available", async function () { + it("should throw error when provider cannot be determined and Ollama not available", async function () { // This test verifies error handling when no provider is available - // Since local LLM may be running, we need to test with an explicit model that + // Since Ollama is running, we need to test with an explicit model that // requires an API key that isn't configured const originalAnthropicKey = process.env.ANTHROPIC_API_KEY; const originalOpenAIKey = process.env.OPENAI_API_KEY; @@ -304,9 +300,9 @@ describe("AI Module", function () { }); describe("text generation", function () { - it("should generate text with default model (local LLM)", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + it("should generate text with default model (Ollama)", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -321,16 +317,16 @@ describe("AI Module", function () { expect(result.finishReason).to.be.a("string"); }); - it("should generate text with explicit local model", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + it("should generate text with explicit Ollama model", async function () { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } try { const result = await generate({ prompt: "Reply with exactly one word: Yes", - model: "local/qwen3-vl:2b", + model: "ollama/qwen3-vl:2b", maxTokens: 20, }); @@ -339,15 +335,15 @@ describe("AI Module", function () { expect(result.usage).to.be.an("object"); expect(result.finishReason).to.be.a("string"); } catch (error) { - // Skip if we get an error (model may not be available) - if (error.message && error.message.includes("model")) { + // Skip if we get an Internal Server Error (model may not be available) + if (error.message && error.message.includes("Internal Server Error")) { this.skip(); } throw error; } }); - it("should generate text with OpenAI model (smoke test)", async function () { + it("should generate text with OpenAI model", async function () { // Skip if no API key is set if (!process.env.OPENAI_API_KEY) { this.skip(); @@ -355,7 +351,7 @@ describe("AI Module", function () { const result = await generate({ prompt: "Say exactly: Hello World", - model: "openai/gpt-5-mini", + model: "openai/gpt-4o-mini", maxTokens: 50, }); @@ -402,8 +398,8 @@ describe("AI Module", function () { }); it("should include system message in generation", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -436,8 +432,8 @@ describe("AI Module", function () { }; it("should generate valid structured output with Zod schema", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -457,8 +453,8 @@ describe("AI Module", function () { }); it("should generate valid structured output with JSON schema", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -478,8 +474,8 @@ describe("AI Module", function () { }); it("should validate generated object against Zod schema", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -502,8 +498,8 @@ describe("AI Module", function () { }); it("should validate generated object against JSON schema", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -533,15 +529,15 @@ describe("AI Module", function () { describe("multimodal input with files", function () { // 100x100 grid PNG with red, blue, and green squares - const GRID_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABvUlEQVR4nO3YUW7DQAwD0b3/pZ0jhEjW2rE5LfT3ANGlE0Bda63LQc26kh/dmMMHbHP4gG0OH7DN4QO2OXzANocP2ObwAdscPmCbyy7Ia/McuICfMllzdxSy+c16i7MQmLMQmLMQmLMQmLMQmLMQmLMQmPNSh42fEJizEJizEJizEJizEJizEJizEJizEJizEJg7fpk6v1zqujGHD9jm8AHbHD5gm8MHbHP4gG0OH7DN4QO2OXzANnf8Mv0yu/9rc/p5Hn+p7y/kzHO85ivLQqYWh85CphaHzkKmFofOQqYWh85CphaHzkKmFofOQqYWh66wEPbsLwQ+9Dem8BNyaHHoLGRqcegsZGpx6CxkanHoLGRqcegsZGpx6CxkanHoLGRqcegKC3FQg39j2hw+YJvDB2xz+IBtDh+wzeEDtjl8wDaHD9jm8AHb3PHLlDm7f73U/3Q3FBLmg/9hLOTPB3mLsxCYsxCYsxCYsxCYsxCYsxCYO1mI46XOd35lwZyFwJyFwJyFwJyFwJyFwJyFwJyFwNzJQhzUwN/UPocP2ObwAdscPmCbwwdsc/iAbQ4fsM3hA7Y5fMAq9wGhbdAbu3rjOQAAAABJRU5ErkJggg=="; + const GRID_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABvUlEQVR4nO3YUW7DQAwD0b3/pZ0jhEjW2rE5LfT3ANGlE0Bda63LQc26kh/dmMMHbHP4gG0OH7DN4QO2OXzANocP2ObwAdscPmCbyy7Ia/McuICfMllzdxSy+c16i7MQmLMQmLMQmLMQmLMQmLMQmLMQmLMQmPNSh42fEJizEJizEJizEJizEJizEJizEJizEJizEJg7fpk6v1zqujGHD9jm8AHbHD5gm8MHbHP4gG0OH7DN4QO2OXzANnf8Mv0yu/9rc/p5Hn+p7y/kzHO85ivLQqYWh85CphaHzkKmFofOQqYWh85CphaHzkKmFofOQqYWh66wEPbsLwQ+9Dem8BNyaHHoLGRqcegsZGpx6CxkanHoLGRqcegsZGpx6CxkanHoLGRqcegKC3FQg39j2hw+YJvDB2xz+IBtDh+wzeEDtjl8wDaHD9jm8AHb3PHLlDm7f73U/3Q3FBLmg/9hLOTPB3mLsxCYsxCYsxCYsxCYsxCYsxCYO1mI46XOd35lwZyFwJyFwJyFwJyFwJyFwJyFwJyFwNzJQhzUwN/UPocP2ObwAdscPmCbwwdsc/iAbQ4fsM3hA7Y5fMAq9wGhbdAbu3rjOQAAAABJRU5ErkJggg=="; it("should handle image URL input", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } - // Note: Some local models may have issues with remote URLs. + // Note: Some Ollama models may have issues with remote URLs. // This test validates the multimodal input construction. try { const result = await generate({ @@ -558,9 +554,9 @@ describe("AI Module", function () { expect(result.text).to.be.a("string"); expect(result.text.length).to.be.greaterThan(0); } catch (error) { - // Some local models may not support remote URLs well - // Skip if we get an error related to image handling - if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { + // Some Ollama models may not support remote URLs well + // Skip if we get a Bad Request error related to image handling + if (error.message && error.message.includes("Bad Request")) { this.skip(); } throw error; @@ -568,8 +564,8 @@ describe("AI Module", function () { }); it("should handle base64 image data", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -591,8 +587,8 @@ describe("AI Module", function () { expect(result.usage).to.be.an("object"); expect(result.finishReason).to.be.a("string"); } catch (error) { - // Some local models may have issues with certain image formats - if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { this.skip(); } throw error; @@ -600,8 +596,8 @@ describe("AI Module", function () { }); it("should handle Buffer image data", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -626,8 +622,8 @@ describe("AI Module", function () { expect(result.usage).to.be.an("object"); expect(result.finishReason).to.be.a("string"); } catch (error) { - // Some local models may have issues with certain image formats - if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { this.skip(); } throw error; @@ -635,8 +631,8 @@ describe("AI Module", function () { }); it("should handle Uint8Array image data", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -662,8 +658,8 @@ describe("AI Module", function () { expect(result.usage).to.be.an("object"); expect(result.finishReason).to.be.a("string"); } catch (error) { - // Some local models may have issues with certain image formats - if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { this.skip(); } throw error; @@ -671,8 +667,8 @@ describe("AI Module", function () { }); it("should handle multiple images with mixed data types", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -699,8 +695,8 @@ describe("AI Module", function () { expect(result.text).to.be.a("string"); expect(result.text.length).to.be.greaterThan(0); } catch (error) { - // Some local models may have issues with certain image formats - if (error.message && (error.message.includes("image") || error.message.includes("multimodal"))) { + // Some Ollama models may have issues with certain image formats + if (error.message && (error.message.includes("Bad Request") || error.message.includes("Internal Server Error"))) { this.skip(); } throw error; @@ -710,8 +706,8 @@ describe("AI Module", function () { describe("messages array support", function () { it("should handle multi-turn conversation", async function () { - // Skip if local LLM is not available - if (!(await isLocalLlmAvailable())) { + // Skip if Ollama is not available + if (!(await isOllamaAvailable())) { this.skip(); } @@ -730,16 +726,15 @@ describe("AI Module", function () { }); describe("error handling", function () { - it("should throw error with invalid model", async function () { + it("should throw error with invalid API key", async function () { try { await generate({ prompt: "Hello", - model: "anthropic/claude-haiku-4.5", - config: {}, + apiKey: "invalid-api-key", }); expect.fail("Should have thrown an error"); } catch (error) { - // Should get an error about missing provider/API key + // Should get an authentication error expect(error).to.be.an("error"); } }); diff --git a/common/test/refineStep.test.js b/common/test/refineStep.test.js index a1fded4..d349aa8 100644 --- a/common/test/refineStep.test.js +++ b/common/test/refineStep.test.js @@ -6,39 +6,23 @@ const { REFINE_STEP_SYSTEM_PROMPT, DEFAULT_MAX_CONTEXT_LENGTH, } = require("../src/refineStep"); -const { isLocalLlmAvailable } = require("../src/ai"); -const { - ensureModelAvailable, - disposeLocalLlm, - MODEL_DOWNLOAD_TIMEOUT_MS, - DEFAULT_LOCAL_MODEL_SMALL, -} = require("../src/localLlm"); +const { isOllamaAvailable } = require("../src/ai"); +const { ensureOllamaRunning, MODEL_PULL_TIMEOUT_MS } = require("../src/ollama"); // Import chai using dynamic import (needed for ESM) let expect; describe("RefineStep Module", function () { - // Increase timeout for real API calls and model download - this.timeout(MODEL_DOWNLOAD_TIMEOUT_MS + 120000); + // Increase timeout for real API calls and container setup + this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); before(async function () { // Dynamic import for chai ESM const chai = await import("chai"); expect = chai.expect; - console.log(" Setting up local LLM for tests..."); - try { - await ensureModelAvailable(DEFAULT_LOCAL_MODEL_SMALL); - console.log(" Local LLM model ready."); - } catch (error) { - console.log(" Warning: Could not set up local LLM:", error.message); - console.log(" Some tests will be skipped."); - } - }); - - after(async function () { - console.log(" Cleaning up local LLM resources..."); - await disposeLocalLlm(); + console.log(" Setting up Ollama for tests..."); + await ensureOllamaRunning(); }); describe("truncateContent", function () { @@ -246,7 +230,7 @@ describe("RefineStep Module", function () { describe("step refinement", function () { it("should refine a step with failure context", async function () { // Skip if no API key is set - if (!(await isLocalLlmAvailable())) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -273,7 +257,7 @@ describe("RefineStep Module", function () { it("should preserve stepId from original step", async function () { // Skip if no API key is set - if (!(await isLocalLlmAvailable())) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -292,7 +276,7 @@ describe("RefineStep Module", function () { it("should preserve sourceLocation from original step", async function () { // Skip if no API key is set - if (!(await isLocalLlmAvailable())) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -322,7 +306,7 @@ describe("RefineStep Module", function () { it("should use model from config when provided", async function () { // Skip if no API key is set - if (!(await isLocalLlmAvailable())) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -359,7 +343,7 @@ describe("RefineStep Module", function () { it("should handle previous steps context", async function () { // Skip if no API key is set - if (!(await isLocalLlmAvailable())) { + if (!(await isOllamaAvailable())) { this.skip(); } @@ -386,7 +370,7 @@ describe("RefineStep Module", function () { describe("step validation", function () { it("should produce steps that pass schema validation", async function () { // Skip if no API key is set - if (!(await isLocalLlmAvailable())) { + if (!(await isOllamaAvailable())) { this.skip(); } From 9261a8a2be197433c1d5c2f9584603357487d914 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 12 Dec 2025 13:41:08 -0800 Subject: [PATCH 79/90] Refactor ollama, including pulling unavailable models --- common/src/ai.js | 100 ++++++++++-------- common/src/ollama.js | 233 ++++++++++++++++++++++++++++++++++++++++- common/test/ai.test.js | 31 +++--- 3 files changed, 303 insertions(+), 61 deletions(-) diff --git a/common/src/ai.js b/common/src/ai.js index 17b6b13..21b6ea4 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -6,10 +6,9 @@ const { createOllama } = require("ollama-ai-provider-v2"); const { z } = require("zod"); const Ajv = require("ajv"); const addFormats = require("ajv-formats"); +const { ensureModelAvailable, isOllamaAvailable } = require("./ollama"); -const DEFAULT_MODEL = "ollama/qwen3-vl:2b"; -const OLLAMA_AVAILABILITY_TIMEOUT_MS = 500; -const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434/api"; +const DEFAULT_MODEL = "ollama/qwen3-vl:8b"; const MAX_SCHEMA_VALIDATION_RETRIES = 3; /** @@ -29,41 +28,20 @@ const modelMap = { "google/gemini-2.5-pro": "gemini-2.5-pro", "google/gemini-3-pro": "gemini-3-pro-preview", // Ollama models - "ollama/qwen3-vl:8b": "hf.co/unsloth/Qwen3-VL-8B-Instruct-GGUF:UD-Q4_K_XL", - "ollama/qwen3-vl:2b": "hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M", + "ollama/qwen3-vl:8b": "qwen3-vl:8b-instruct-q4_K_M", + "ollama/qwen3-vl:4b": "qwen3-vl:4b-instruct-q4_K_M", + "ollama/qwen3-vl:2b": "qwen3-vl:2b-instruct-q4_K_M", }; -/** - * Checks if Ollama is available at localhost:11434. - * @param {string} [baseUrl] - Optional base URL override. - * @returns {Promise} True if Ollama is available. - */ -const isOllamaAvailable = async (baseUrl) => { - const url = baseUrl || "http://localhost:11434"; - try { - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), OLLAMA_AVAILABILITY_TIMEOUT_MS); - - const response = await fetch(url, { - method: "GET", - signal: controller.signal, - }); - - clearTimeout(timeoutId); - return response.ok; - } catch { - return false; - } -}; - -const getDefaultProvider = async (config = {}) => { +const getDefaultProvider = async (config = {}) => { const ollamaBaseUrl = config?.integrations?.ollama?.baseUrl; // Try to detect from environment variables if no model is provided if (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) { return { provider: "anthropic", model: "claude-haiku-4-5", - apiKey: process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey, + apiKey: + process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey, }; } else if (process.env.OPENAI_API_KEY || config.integrations?.openAi) { return { @@ -71,11 +49,16 @@ const getDefaultProvider = async (config = {}) => { model: "gpt-5-mini", apiKey: process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey, }; - } else if (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations?.google) { + } else if ( + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + config.integrations?.google + ) { return { provider: "google", model: "gemini-2.5-flash", - apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google.apiKey, + apiKey: + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + config.integrations.google.apiKey, }; } else if (await isOllamaAvailable(ollamaBaseUrl)) { // Local, no API key needed @@ -83,7 +66,7 @@ const getDefaultProvider = async (config = {}) => { provider: "ollama", model: modelMap["ollama/qwen3-vl:8b"], apiKey: null, - baseURL: ollamaBaseUrl || DEFAULT_OLLAMA_BASE_URL, + baseURL: ollamaBaseUrl || undefined, }; } else { return { provider: null, model: null, apiKey: null }; @@ -101,22 +84,45 @@ const detectProvider = async (config, model) => { if (!detectedModel) return getDefaultProvider(config); if (model.startsWith("ollama/")) { - const ollamaBaseUrl = config.integrations?.ollama?.baseUrl || DEFAULT_OLLAMA_BASE_URL; - return { provider: "ollama", model: detectedModel, apiKey: null, baseURL: ollamaBaseUrl }; + const ollamaBaseUrl = + config.integrations?.ollama?.baseUrl || undefined; + const isModelAvailable = await ensureModelAvailable({ + model: detectedModel, + baseUrl: ollamaBaseUrl, + }); + return { + provider: "ollama", + model: detectedModel, + apiKey: null, + baseURL: ollamaBaseUrl, + }; } - if (model.startsWith("anthropic/") && (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic)) { - const apiKey = process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey; + if ( + model.startsWith("anthropic/") && + (process.env.ANTHROPIC_API_KEY || config.integrations?.anthropic) + ) { + const apiKey = + process.env.ANTHROPIC_API_KEY || config.integrations.anthropic.apiKey; return { provider: "anthropic", model: detectedModel, apiKey }; } - if (model.startsWith("openai/") && (process.env.OPENAI_API_KEY || config.integrations?.openAi)) { - const apiKey = process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey; + if ( + model.startsWith("openai/") && + (process.env.OPENAI_API_KEY || config.integrations?.openAi) + ) { + const apiKey = + process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey; return { provider: "openai", model: detectedModel, apiKey }; } - if (model.startsWith("google/") && (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations?.google)) { - const apiKey = process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google.apiKey; + if ( + model.startsWith("google/") && + (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations?.google) + ) { + const apiKey = + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + config.integrations.google.apiKey; return { provider: "google", model: detectedModel, apiKey }; } @@ -191,8 +197,10 @@ const fileToImagePart = (file) => { } // Check if data is a URL string - if (typeof file.data === "string" && - (file.data.startsWith("http://") || file.data.startsWith("https://"))) { + if ( + typeof file.data === "string" && + (file.data.startsWith("http://") || file.data.startsWith("https://")) + ) { return { type: "image", image: new URL(file.data), @@ -345,7 +353,10 @@ const getApiKey = (config, provider) => { provider === "google" && (process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google) ) { - return process.env.GOOGLE_GENERATIVE_AI_API_KEY || config.integrations.google.apiKey; + return ( + process.env.GOOGLE_GENERATIVE_AI_API_KEY || + config.integrations.google.apiKey + ); } return undefined; @@ -617,7 +628,6 @@ module.exports = { generate, detectProvider, getApiKey, - isOllamaAvailable, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, diff --git a/common/src/ollama.js b/common/src/ollama.js index 42217aa..ae8c8ae 100644 --- a/common/src/ollama.js +++ b/common/src/ollama.js @@ -1,9 +1,40 @@ const { execSync, spawn } = require("child_process"); const fs = require("fs"); -const { isOllamaAvailable, modelMap } = require("./ai"); /** Default Ollama model to use */ -const DEFAULT_OLLAMA_MODEL = modelMap["ollama/qwen3-vl:8b"]; +const DEFAULT_OLLAMA_MODEL = "qwen3-vl:8b-instruct-q4_K_M"; + +/** Timeout for checking Ollama availability */ +const OLLAMA_AVAILABILITY_TIMEOUT_MS = 500; + +/** + * Checks if Ollama is available at the specified URL. + * @param {string} [baseUrl] - Optional base URL override. + * @returns {Promise} True if Ollama is available. + */ +const isOllamaAvailable = async (baseUrl) => { + const url = baseUrl || "http://localhost:11434"; + try { + const controller = new AbortController(); + const timeoutId = setTimeout( + () => controller.abort(), + OLLAMA_AVAILABILITY_TIMEOUT_MS + ); + + const response = await fetch(url, { + method: "GET", + signal: controller.signal, + }); + + clearTimeout(timeoutId); + return response.ok; + } catch { + return false; + } +}; + +/** Default Ollama base URL */ +const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434"; /** Maximum time to wait for model pull (10 minutes) */ const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; @@ -185,14 +216,212 @@ const ensureOllamaRunning = async (model = DEFAULT_OLLAMA_MODEL) => { return true; }; +/** + * Checks if a model is available locally. + * @param {Object} options - Options object. + * @param {string} options.model - The model name to check. + * @param {string} [options.baseUrl] - Optional base URL for Ollama API. + * @returns {Promise} True if the model is available locally. + */ +const isModelAvailable = async ({ model, baseUrl = DEFAULT_OLLAMA_BASE_URL }) => { + try { + const response = await fetch(`${baseUrl}/api/tags`); + if (!response.ok) { + return false; + } + const data = await response.json(); + const models = data.models || []; + + // Check if the model name matches any locally available model + // Model names can be in format "name:tag" or just "name" (defaults to "latest") + const normalizedModel = model.includes(":") ? model : `${model}:latest`; + + return models.some(m => { + const localModel = m.name || m.model; + const normalizedLocal = localModel.includes(":") ? localModel : `${localModel}:latest`; + return normalizedLocal === normalizedModel || localModel === model; + }); + } catch { + return false; + } +}; + +/** + * Formats bytes into a human-readable string. + * @param {number} bytes - The number of bytes. + * @returns {string} Human-readable size string. + */ +const formatBytes = (bytes) => { + if (bytes === 0) return "0 B"; + const k = 1024; + const sizes = ["B", "KB", "MB", "GB", "TB"]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`; +}; + +/** + * Renders a progress bar to the console. + * @param {Object} options - Options object. + * @param {number} options.completed - Bytes completed. + * @param {number} options.total - Total bytes. + * @param {string} options.status - Current status message. + * @param {number} [options.barWidth=40] - Width of the progress bar. + */ +const renderProgressBar = ({ completed, total, status, barWidth = 40 }) => { + const percentage = total > 0 ? Math.min(100, (completed / total) * 100) : 0; + const filledWidth = Math.round((percentage / 100) * barWidth); + const emptyWidth = barWidth - filledWidth; + + const bar = "█".repeat(filledWidth) + "░".repeat(emptyWidth); + const percentStr = percentage.toFixed(1).padStart(5); + const completedStr = formatBytes(completed); + const totalStr = formatBytes(total); + + // Use carriage return to overwrite the line + process.stdout.write(`\r [${bar}] ${percentStr}% | ${completedStr}/${totalStr} | ${status}`); +}; + +/** + * Ensures a model is available, pulling it if necessary. + * Uses the /api/pull endpoint with streaming to display progress. + * @param {Object} options - Options object. + * @param {string} options.model - The model name to ensure is available. + * @param {string} [options.baseUrl] - Optional base URL for Ollama API. + * @returns {Promise} True if the model is available, false if it cannot be made available. + */ +const ensureModelAvailable = async ({ model, baseUrl = DEFAULT_OLLAMA_BASE_URL }) => { + // First check if Ollama is available + if (!await isOllamaAvailable()) { + console.error(" Ollama is not available."); + return false; + } + + // Check if model is already available + if (await isModelAvailable({ model, baseUrl })) { + console.log(` Model ${model} is already available.`); + return true; + } + + console.log(` Pulling model ${model}...`); + + try { + const response = await fetch(`${baseUrl}/api/pull`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ model }), + }); + + if (!response.ok) { + console.error(`\n Failed to pull model: HTTP ${response.status}`); + return false; + } + + const reader = response.body.getReader(); + const decoder = new TextDecoder(); + let buffer = ""; + let lastStatus = ""; + let lastCompleted = 0; + let lastTotal = 0; + + while (true) { + const { done, value } = await reader.read(); + + if (done) { + break; + } + + buffer += decoder.decode(value, { stream: true }); + + // Process complete JSON objects from the buffer + const lines = buffer.split("\n"); + buffer = lines.pop() || ""; // Keep incomplete line in buffer + + for (const line of lines) { + if (!line.trim()) continue; + + try { + const data = JSON.parse(line); + + if (data.error) { + console.error(`\n Error pulling model: ${data.error}`); + return false; + } + + lastStatus = data.status || lastStatus; + + // Update progress if we have total/completed info + if (data.total !== undefined) { + lastTotal = data.total; + lastCompleted = data.completed || 0; + renderProgressBar({ + completed: lastCompleted, + total: lastTotal, + status: lastStatus.substring(0, 30), + }); + } else if (lastTotal === 0) { + // Status-only update (no download progress) + process.stdout.write(`\r ${lastStatus.padEnd(80)}`); + } + + // Check for success + if (data.status === "success") { + process.stdout.write("\n"); + console.log(` Model ${model} is ready.`); + return true; + } + } catch { + // Ignore JSON parse errors for incomplete data + } + } + } + + // Process any remaining buffer + if (buffer.trim()) { + try { + const data = JSON.parse(buffer); + if (data.status === "success") { + process.stdout.write("\n"); + console.log(` Model ${model} is ready.`); + return true; + } + if (data.error) { + console.error(`\n Error pulling model: ${data.error}`); + return false; + } + } catch { + // Ignore parse errors + } + } + + // If we got here without success, check if model is now available + process.stdout.write("\n"); + const available = await isModelAvailable({ model, baseUrl }); + if (available) { + console.log(` Model ${model} is ready.`); + } else { + console.error(` Failed to make model ${model} available.`); + } + return available; + + } catch (error) { + console.error(`\n Error pulling model: ${error.message}`); + return false; + } +}; + module.exports = { DEFAULT_OLLAMA_MODEL, + DEFAULT_OLLAMA_BASE_URL, MODEL_PULL_TIMEOUT_MS, OLLAMA_STARTUP_TIMEOUT_MS, + OLLAMA_AVAILABILITY_TIMEOUT_MS, + isOllamaAvailable, detectGpuType, startOllamaContainer, waitForOllama, pullOllamaModel, stopOllamaContainer, ensureOllamaRunning, + isModelAvailable, + ensureModelAvailable, }; diff --git a/common/test/ai.test.js b/common/test/ai.test.js index ddfb070..f4c1888 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -3,6 +3,7 @@ const { z } = require("zod"); const { ensureOllamaRunning, stopOllamaContainer, + isOllamaAvailable, MODEL_PULL_TIMEOUT_MS, } = require("../src/ollama"); @@ -17,7 +18,6 @@ const { generate, detectProvider, getApiKey, - isOllamaAvailable, modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, @@ -60,8 +60,8 @@ describe("AI Module", function () { }); it("should contain Ollama model mappings", function () { - expect(modelMap["ollama/qwen3-vl:2b"]).to.equal("hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); - expect(modelMap["ollama/qwen3-vl:8b"]).to.equal("hf.co/unsloth/Qwen3-VL-8B-Instruct-GGUF:UD-Q4_K_XL"); + expect(modelMap["ollama/qwen3-vl:2b"]).to.equal("qwen3-vl:2b-instruct-q4_K_M"); + expect(modelMap["ollama/qwen3-vl:8b"]).to.equal("qwen3-vl:8b-instruct-q4_K_M"); }); it("should contain Google Gemini model mappings", function () { @@ -108,16 +108,16 @@ describe("AI Module", function () { it("should detect Ollama provider for known Ollama models", async function () { const config = {}; - const result = await detectProvider(config, "ollama/qwen3-vl:2b"); + const result = await detectProvider(config, "ollama/qwen3-vl:8b"); expect(result.provider).to.equal("ollama"); - expect(result.model).to.equal("hf.co/unsloth/Qwen3-VL-2B-Instruct-GGUF:Q4_K_M"); + expect(result.model).to.equal("qwen3-vl:8b-instruct-q4_K_M"); expect(result.apiKey).to.be.null; expect(result.baseURL).to.equal("http://localhost:11434/api"); }); it("should use custom baseUrl from config for Ollama", async function () { const config = { integrations: { ollama: { baseUrl: "http://custom:11434/api" } } }; - const result = await detectProvider(config, "ollama/qwen3-vl:2b"); + const result = await detectProvider(config, "ollama/qwen3-vl:8b"); expect(result.provider).to.equal("ollama"); expect(result.baseURL).to.equal("http://custom:11434/api"); }); @@ -226,7 +226,7 @@ describe("AI Module", function () { const result = await detectProvider(config, "unknown-model"); // Ollama should be preferred when available expect(result.provider).to.equal("ollama"); - expect(result.model).to.equal("qwen3-vl:2b"); + expect(result.model).to.equal("qwen3-vl:8b-instruct-q4_K_M"); }); it("should return null values when model is known but no API key for that provider", async function () { @@ -240,8 +240,8 @@ describe("AI Module", function () { }); describe("DEFAULT_MODEL", function () { - it("should be ollama/qwen3-vl:2b", function () { - expect(DEFAULT_MODEL).to.equal("ollama/qwen3-vl:2b"); + it("should be ollama/qwen3-vl:8b", function () { + expect(DEFAULT_MODEL).to.equal("ollama/qwen3-vl:8b"); }); }); @@ -326,7 +326,7 @@ describe("AI Module", function () { try { const result = await generate({ prompt: "Reply with exactly one word: Yes", - model: "ollama/qwen3-vl:2b", + model: "ollama/qwen3-vl:8b", maxTokens: 20, }); @@ -713,15 +713,18 @@ describe("AI Module", function () { const result = await generate({ messages: [ - { role: "user", content: "My name is Alice." }, - { role: "assistant", content: "Hello Alice! Nice to meet you." }, - { role: "user", content: "What is my name?" }, + { role: "user", content: "There were red, blue, and green balls." }, + { role: "assistant", content: "Okay, three balls of different colors." }, + { role: "user", content: "Which colors were the balls?" }, ], + model: "ollama/qwen3-vl:4b", maxTokens: 50, }); expect(result.text).to.be.a("string"); - expect(result.text.toLowerCase()).to.include("alice"); + expect(result.text.toLowerCase()).to.include("red"); + expect(result.text.toLowerCase()).to.include("blue"); + expect(result.text.toLowerCase()).to.include("green"); }); }); From ffa1b9876f169fedf1bca04dd7c3ad5a6df72fb2 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 12 Dec 2025 13:49:31 -0800 Subject: [PATCH 80/90] Update Ollama integration: fix base URL and remove unused model pull function --- common/src/ai.js | 6 +++--- common/src/ollama.js | 44 ++++-------------------------------------- common/test/ai.test.js | 1 - 3 files changed, 7 insertions(+), 44 deletions(-) diff --git a/common/src/ai.js b/common/src/ai.js index 21b6ea4..2d85d0b 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -6,7 +6,7 @@ const { createOllama } = require("ollama-ai-provider-v2"); const { z } = require("zod"); const Ajv = require("ajv"); const addFormats = require("ajv-formats"); -const { ensureModelAvailable, isOllamaAvailable } = require("./ollama"); +const { ensureModelAvailable, isOllamaAvailable, DEFAULT_OLLAMA_BASE_URL } = require("./ollama"); const DEFAULT_MODEL = "ollama/qwen3-vl:8b"; const MAX_SCHEMA_VALIDATION_RETRIES = 3; @@ -85,8 +85,8 @@ const detectProvider = async (config, model) => { if (model.startsWith("ollama/")) { const ollamaBaseUrl = - config.integrations?.ollama?.baseUrl || undefined; - const isModelAvailable = await ensureModelAvailable({ + config.integrations?.ollama?.baseUrl || DEFAULT_OLLAMA_BASE_URL; + await ensureModelAvailable({ model: detectedModel, baseUrl: ollamaBaseUrl, }); diff --git a/common/src/ollama.js b/common/src/ollama.js index ae8c8ae..0e86ed7 100644 --- a/common/src/ollama.js +++ b/common/src/ollama.js @@ -34,7 +34,7 @@ const isOllamaAvailable = async (baseUrl) => { }; /** Default Ollama base URL */ -const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434"; +const DEFAULT_OLLAMA_BASE_URL = "http://localhost:11434/api"; /** Maximum time to wait for model pull (10 minutes) */ const MODEL_PULL_TIMEOUT_MS = 10 * 60 * 1000; @@ -135,41 +135,6 @@ const waitForOllama = async (timeoutMs = OLLAMA_STARTUP_TIMEOUT_MS) => { return false; }; -/** - * Pulls the specified Ollama model with progress output. - * @param {string} [model=DEFAULT_OLLAMA_MODEL] - The model to pull. - * @returns {Promise} - */ -const pullOllamaModel = async (model = DEFAULT_OLLAMA_MODEL) => { - console.log(` Pulling ${model} model (this may take up to 10 minutes on first run)...`); - - return new Promise((resolve, reject) => { - const pullProcess = spawn("docker", ["exec", "ollama", "ollama", "pull", model], { - stdio: "inherit" - }); - - const timeoutId = setTimeout(() => { - pullProcess.kill(); - reject(new Error("Model pull timed out after 10 minutes")); - }, MODEL_PULL_TIMEOUT_MS); - - pullProcess.on("close", (code) => { - clearTimeout(timeoutId); - if (code === 0) { - console.log(` Model ${model} is ready.`); - resolve(); - } else { - reject(new Error(`Model pull failed with exit code ${code}`)); - } - }); - - pullProcess.on("error", (err) => { - clearTimeout(timeoutId); - reject(err); - }); - }); -}; - /** * Stops and removes the Ollama container. * @returns {Promise} @@ -212,7 +177,7 @@ const ensureOllamaRunning = async (model = DEFAULT_OLLAMA_MODEL) => { throw new Error("Ollama container started but did not become available"); } - await pullOllamaModel(model); + await ensureModelAvailable({ model }); return true; }; @@ -225,7 +190,7 @@ const ensureOllamaRunning = async (model = DEFAULT_OLLAMA_MODEL) => { */ const isModelAvailable = async ({ model, baseUrl = DEFAULT_OLLAMA_BASE_URL }) => { try { - const response = await fetch(`${baseUrl}/api/tags`); + const response = await fetch(`${baseUrl}/tags`); if (!response.ok) { return false; } @@ -305,7 +270,7 @@ const ensureModelAvailable = async ({ model, baseUrl = DEFAULT_OLLAMA_BASE_URL } console.log(` Pulling model ${model}...`); try { - const response = await fetch(`${baseUrl}/api/pull`, { + const response = await fetch(`${baseUrl}/pull`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ model }), @@ -419,7 +384,6 @@ module.exports = { detectGpuType, startOllamaContainer, waitForOllama, - pullOllamaModel, stopOllamaContainer, ensureOllamaRunning, isModelAvailable, diff --git a/common/test/ai.test.js b/common/test/ai.test.js index f4c1888..579e76b 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -717,7 +717,6 @@ describe("AI Module", function () { { role: "assistant", content: "Okay, three balls of different colors." }, { role: "user", content: "Which colors were the balls?" }, ], - model: "ollama/qwen3-vl:4b", maxTokens: 50, }); From 88a2597fe58b949c833f33be643f8328b2eb4841 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 12 Dec 2025 13:51:08 -0800 Subject: [PATCH 81/90] Refactor import statements in refineStep tests for clarity --- common/test/refineStep.test.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/test/refineStep.test.js b/common/test/refineStep.test.js index d349aa8..bff5290 100644 --- a/common/test/refineStep.test.js +++ b/common/test/refineStep.test.js @@ -6,8 +6,7 @@ const { REFINE_STEP_SYSTEM_PROMPT, DEFAULT_MAX_CONTEXT_LENGTH, } = require("../src/refineStep"); -const { isOllamaAvailable } = require("../src/ai"); -const { ensureOllamaRunning, MODEL_PULL_TIMEOUT_MS } = require("../src/ollama"); +const { ensureOllamaRunning, isOllamaAvailable, MODEL_PULL_TIMEOUT_MS } = require("../src/ollama"); // Import chai using dynamic import (needed for ESM) let expect; From 3673d83819fa5a7a411c65859efbb9a32278a5c3 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 12 Dec 2025 15:06:34 -0800 Subject: [PATCH 82/90] Filter models in modelMap to only include those starting with "ollama/" --- common/dev/dev.js | 2 +- common/src/ai.js | 266 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 264 insertions(+), 4 deletions(-) diff --git a/common/dev/dev.js b/common/dev/dev.js index d9254df..075e4fd 100644 --- a/common/dev/dev.js +++ b/common/dev/dev.js @@ -26,7 +26,7 @@ const testRefineStep = async (model) => { (async () => { // get list of models from modelMap - const models = Object.keys(modelMap); + const models = Object.keys(modelMap).filter((m) => m.startsWith("ollama/")); const results = []; for (const model of models) { diff --git a/common/src/ai.js b/common/src/ai.js index 2d85d0b..9a0782f 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -31,6 +31,10 @@ const modelMap = { "ollama/qwen3-vl:8b": "qwen3-vl:8b-instruct-q4_K_M", "ollama/qwen3-vl:4b": "qwen3-vl:4b-instruct-q4_K_M", "ollama/qwen3-vl:2b": "qwen3-vl:2b-instruct-q4_K_M", + "ollama/gemma3:4bq4": "gemma3:4b-it-q4_K_M", + "ollama/gemma3:4bq8": "gemma3:4b-it-q8_0", + "ollama/gemma3:12bq4": "gemma3:12b-it-q4_K_M", + "ollama/gemma3:12bq8": "gemma3:12b-it-q8_0", }; const getDefaultProvider = async (config = {}) => { @@ -324,6 +328,250 @@ const toAiSdkSchema = (schema) => { return jsonSchema(schema); }; +/** + * Dereferences $ref pointers in a schema by inlining the referenced schemas. + * Supports both JSON Schema style (#/definitions/...) and OpenAPI style (#/components/schemas/...). + * @param {Object} schema - The schema to dereference. + * @param {Object} rootSchema - The root schema containing definitions/components. + * @returns {Object} The dereferenced schema. + */ +const dereferenceSchema = (schema, rootSchema) => { + if (!schema || typeof schema !== "object") { + return schema; + } + + // Handle arrays + if (Array.isArray(schema)) { + return schema.map((item) => dereferenceSchema(item, rootSchema)); + } + + // Handle $ref + if (schema.$ref) { + const refPath = schema.$ref; + let resolved = null; + + // Parse the reference path + if (refPath.startsWith("#/")) { + const pathParts = refPath.slice(2).split("/"); + resolved = rootSchema; + for (const part of pathParts) { + resolved = resolved?.[part]; + if (!resolved) break; + } + } + + if (resolved) { + // Recursively dereference the resolved schema + return dereferenceSchema(resolved, rootSchema); + } + // If we can't resolve, return an empty object + return {}; + } + + // Recursively process all properties + const result = {}; + for (const [key, value] of Object.entries(schema)) { + if (typeof value === "object" && value !== null) { + result[key] = dereferenceSchema(value, rootSchema); + } else { + result[key] = value; + } + } + + return result; +}; + +/** + * Simplifies a JSON schema for providers with limited schema support (e.g., Ollama). + * - Dereferences $ref pointers + * - Merges allOf schemas + * - Converts top-level anyOf (discriminated unions) into a single object with all options as optional properties + * - Simplifies nested anyOf by preferring object types + * - Removes unsupported keywords like pattern, components, etc. + * @param {Object} schema - The JSON schema to simplify. + * @returns {Object} A simplified schema compatible with basic JSON schema support. + */ +const simplifySchemaForOllama = (schema) => { + // First, dereference any $ref pointers + const dereferenced = dereferenceSchema(schema, schema); + + // Then simplify the dereferenced schema + return simplifySchemaRecursive(dereferenced, true); +}; + +/** + * Recursively simplifies a schema. + * @param {Object} schema - The schema to simplify. + * @param {boolean} isTopLevel - Whether this is the top-level schema (affects anyOf handling). + * @returns {Object} The simplified schema. + */ +const simplifySchemaRecursive = (schema, isTopLevel = false) => { + if (!schema || typeof schema !== "object") { + return schema; + } + + // Handle arrays + if (Array.isArray(schema)) { + return schema.map((item) => simplifySchemaRecursive(item, false)); + } + + const simplified = {}; + + // Check if this is a top-level discriminated union (anyOf with action types) + // These have anyOf where each option has allOf with a required action property + const isDiscriminatedUnion = + isTopLevel && + schema.anyOf && + Array.isArray(schema.anyOf) && + schema.anyOf.length > 1 && + schema.anyOf.every( + (opt) => + opt.allOf || + (opt.required && opt.required.length === 1 && opt.properties) + ); + + for (const [key, value] of Object.entries(schema)) { + // Skip unsupported keywords entirely + if ( + [ + "$schema", + "components", + "examples", + "dynamicDefaults", + "transform", + "not", + "$id", + "$ref", + "definitions", + "$defs", + "pattern", + ].includes(key) + ) { + continue; + } + + // Handle top-level anyOf as discriminated union - merge ALL options + if (key === "anyOf" && isDiscriminatedUnion) { + // Merge all anyOf options into a single schema with all properties optional + const mergedProperties = {}; + + for (const option of value) { + const simplifiedOption = simplifySchemaRecursive(option, false); + + if (simplifiedOption.properties) { + for (const [propKey, propValue] of Object.entries(simplifiedOption.properties)) { + // Don't overwrite if we already have this property (first wins for common props) + if (!mergedProperties[propKey]) { + mergedProperties[propKey] = propValue; + } + } + } + } + + simplified.properties = { + ...simplified.properties, + ...mergedProperties, + }; + // Don't set required - all action properties should be optional in the merged schema + simplified.type = "object"; + continue; + } + + // Handle nested anyOf/oneOf - prefer object types, simplify to single option + if (key === "anyOf" || key === "oneOf") { + const options = value; + + // For nested anyOf, prefer object type schemas + const objectOption = options.find( + (opt) => opt.type === "object" || opt.properties + ); + const selectedOption = objectOption || options[0]; + + if (selectedOption) { + // Merge the selected option into the parent + const simplifiedOption = simplifySchemaRecursive(selectedOption, false); + Object.assign(simplified, simplifiedOption); + } + continue; + } + + // Handle allOf - merge all schemas together + if (key === "allOf") { + for (const subSchema of value) { + const simplifiedSub = simplifySchemaRecursive(subSchema, false); + // Merge properties + if (simplifiedSub.properties) { + simplified.properties = { + ...simplified.properties, + ...simplifiedSub.properties, + }; + } + // Merge required arrays (but we'll clear required for discriminated unions later) + if (simplifiedSub.required) { + simplified.required = [ + ...new Set([ + ...(simplified.required || []), + ...simplifiedSub.required, + ]), + ]; + } + // Copy type if not set + if (simplifiedSub.type && !simplified.type) { + simplified.type = simplifiedSub.type; + } + // Copy other simple properties + for (const [subKey, subValue] of Object.entries(simplifiedSub)) { + if (!["properties", "required", "type"].includes(subKey)) { + simplified[subKey] = subValue; + } + } + } + continue; + } + + // Handle patternProperties - convert to additionalProperties + if (key === "patternProperties") { + // Use the first pattern's schema as additionalProperties + const patterns = Object.values(value); + if (patterns.length > 0) { + simplified.additionalProperties = simplifySchemaRecursive(patterns[0], false); + } + continue; + } + + // Recursively simplify nested objects + if (key === "properties" && typeof value === "object") { + simplified.properties = {}; + for (const [propKey, propValue] of Object.entries(value)) { + simplified.properties[propKey] = simplifySchemaRecursive(propValue, false); + } + continue; + } + + // Recursively simplify items in arrays + if (key === "items") { + simplified.items = simplifySchemaRecursive(value, false); + continue; + } + + // Recursively simplify additionalProperties + if (key === "additionalProperties" && typeof value === "object") { + simplified.additionalProperties = simplifySchemaRecursive(value, false); + continue; + } + + // Copy other properties as-is + simplified[key] = value; + } + + // Ensure type is set for objects with properties + if (simplified.properties && !simplified.type) { + simplified.type = "object"; + } + + return simplified; +}; + /** * Extracts the API key for a provider from a Doc Detective config object. * @param {Object} config - The Doc Detective configuration object. @@ -488,6 +736,7 @@ const generate = async ({ schemaDescription, prompt, messages, + provider: detected.provider, }); } @@ -510,6 +759,7 @@ const generate = async ({ * @param {string} [options.schemaDescription] - Description for the schema. * @param {string} [options.prompt] - Original prompt for retry context. * @param {Array} [options.messages] - Original messages for retry context. + * @param {string} [options.provider] - The provider being used (e.g., "ollama", "anthropic"). * @returns {Promise} Generation result with validated object. */ const generateWithSchemaValidation = async ({ @@ -519,11 +769,20 @@ const generateWithSchemaValidation = async ({ schemaDescription, prompt, messages, + provider, }) => { let lastError = null; let lastObject = null; let wrappedSchema = false; + // Store the original schema for validation (before any simplification) + const originalSchema = schema; + + // Simplify schema for Ollama which has limited JSON Schema support + if (provider === "ollama" && !isZodSchema(schema)) { + schema = simplifySchemaForOllama(schema); + } + // If JSON schema with allOf/anyOf/oneOf at the top level, wrap it in an object if (!isZodSchema(schema) && (schema.allOf || schema.anyOf || schema.oneOf)) { schema = { @@ -577,9 +836,9 @@ const generateWithSchemaValidation = async ({ const validationObject = wrappedSchema ? result.object.object : result.object; - const validationSchema = wrappedSchema - ? schema.properties.object - : schema; + // Use original schema for validation (before Ollama simplification) + // This ensures the output conforms to the full schema requirements + const validationSchema = originalSchema; // Validate the generated object against the schema ourselves const validation = validateAgainstSchema( @@ -631,4 +890,5 @@ module.exports = { modelMap, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES, + simplifySchemaForOllama, }; From 1ea5e3c16a487de55e0dd42c5230f2911bbe5571 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 12 Dec 2025 20:40:19 -0800 Subject: [PATCH 83/90] Enhance Ollama container management: check Docker installation and handle availability warnings in tests --- common/src/ollama.js | 16 ++++++++++++++-- common/test/ai.test.js | 7 +++++-- common/test/refineStep.test.js | 5 ++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/common/src/ollama.js b/common/src/ollama.js index 0e86ed7..acda711 100644 --- a/common/src/ollama.js +++ b/common/src/ollama.js @@ -72,6 +72,13 @@ const detectGpuType = () => { * @returns {Promise} */ const startOllamaContainer = async () => { + // Check if Docker is installed + try { + execSync("docker --version", { stdio: "ignore" }); + } catch { + throw new Error("Docker is not installed or not in PATH"); + } + const gpuType = detectGpuType(); console.log(` Detected GPU type: ${gpuType}`); @@ -161,16 +168,21 @@ const stopOllamaContainer = async () => { */ const ensureOllamaRunning = async (model = DEFAULT_OLLAMA_MODEL) => { if (await isOllamaAvailable()) { - console.log(" Ollama is already running."); + console.log("Ollama is already running."); return true; } - console.log(" Ollama not detected, starting Docker container..."); + console.log("Ollama not detected, starting Docker container..."); // Clean up any existing container first await stopOllamaContainer(); + try { await startOllamaContainer(); + } catch (error) { + console.error(`Failed to start Ollama container: ${error.message}`); + return false; + } const available = await waitForOllama(); if (!available) { diff --git a/common/test/ai.test.js b/common/test/ai.test.js index 579e76b..0e3743a 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -35,13 +35,16 @@ describe("AI Module", function () { console.log(" Setting up Ollama for tests..."); // Track if we need to start the container const wasAlreadyRunning = await isOllamaAvailable(); - await ensureOllamaRunning(); + const isOllamaRunning = await ensureOllamaRunning(); + if (!isOllamaRunning) { + console.warn("Warning: Ollama is not available. Some tests may be skipped."); + } weStartedOllama = !wasAlreadyRunning; }); after(async function () { if (weStartedOllama) { - console.log(" Cleaning up Ollama container..."); + console.log("Cleaning up Ollama container..."); await stopOllamaContainer(); } }); diff --git a/common/test/refineStep.test.js b/common/test/refineStep.test.js index bff5290..5a6eed0 100644 --- a/common/test/refineStep.test.js +++ b/common/test/refineStep.test.js @@ -21,7 +21,10 @@ describe("RefineStep Module", function () { expect = chai.expect; console.log(" Setting up Ollama for tests..."); - await ensureOllamaRunning(); + const isOllamaRunning = await ensureOllamaRunning(); + if (!isOllamaRunning) { + console.warn("Warning: Ollama is not available. Some tests may be skipped."); + } }); describe("truncateContent", function () { From c9a11b1b9c40df95a315a3e4c317fb8643e0cd48 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 12 Dec 2025 21:59:00 -0800 Subject: [PATCH 84/90] Refactor AI provider availability checks in DebugRunner: streamline detection and remove redundant state --- cli/src/cli/builder/DebugRunner.mjs | 40 ++++++++++------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/cli/src/cli/builder/DebugRunner.mjs b/cli/src/cli/builder/DebugRunner.mjs index 1216af0..6d7c4e3 100644 --- a/cli/src/cli/builder/DebugRunner.mjs +++ b/cli/src/cli/builder/DebugRunner.mjs @@ -27,16 +27,6 @@ import { // AI utilities from common const { refineStep, detectProvider } = require('doc-detective-common'); -/** - * Check if an AI provider is available via environment variables or config - * @param {Object} [config={}] - Optional configuration object - * @returns {boolean} True if an AI provider is available - */ -function isAiAvailable(config = {}) { - const detected = detectProvider(config, null); - return detected.provider !== null && detected.apiKey !== null; -} - /** * Truncate a string to a maximum number of grapheme clusters (user-perceived characters). * Uses Intl.Segmenter if available (Node 16+), otherwise falls back to Array.from for code-point safety. @@ -126,7 +116,6 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { const [isExecuting, setIsExecuting] = useState(false); // AI refinement state - const [aiAvailable] = useState(() => isAiAvailable()); const [aiRefinedStep, setAiRefinedStep] = useState(null); const [aiRefineError, setAiRefineError] = useState(null); @@ -217,7 +206,13 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { // Attempt AI refinement of a failed step const attemptAiRefinement = useCallback(async (step, failureMessage) => { - if (!aiAvailable) return; + // Check if AI provider is actually available (detectProvider is async) + const detectedProvider = await detectProvider(); + if (!detectedProvider.provider) { + // No AI provider available, skip refinement + setPhase('stepResult'); + return; + } setAiRefinedStep(null); setAiRefineError(null); @@ -226,7 +221,6 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { try { // Get previous steps for context const previousSteps = (localTest.steps || []).slice(0, currentStepIndex); - const detectedProvider = await detectProvider(); // Try to get the current browser DOM for context let dom = null; @@ -276,7 +270,7 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { setAiRefineError(error.message || 'AI refinement failed'); setPhase('aiRefineResult'); } - }, [aiAvailable, localTest.steps, currentStepIndex, runner]); + }, [localTest.steps, currentStepIndex, runner]); // Execute current step const executeStep = useCallback(async () => { @@ -320,12 +314,8 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { }, 1500); } else { setResults((prev) => ({ ...prev, failed: prev.failed + 1 })); - // If AI is available, attempt automatic refinement - if (aiAvailable) { - attemptAiRefinement(step, result.description || 'Step failed'); - } else { - setPhase('stepResult'); - } + // Attempt automatic AI refinement (will check provider availability internally) + attemptAiRefinement(step, result.description || 'Step failed'); } } catch (error) { setStepResult({ @@ -333,16 +323,12 @@ const DebugRunner = ({ test, testIndex, onComplete, onCancel }) => { description: error.message || 'Step execution failed', }); setResults((prev) => ({ ...prev, failed: prev.failed + 1 })); - // If AI is available, attempt automatic refinement - if (aiAvailable) { - attemptAiRefinement(steps[currentStepIndex], error.message || 'Step execution failed'); - } else { - setPhase('stepResult'); - } + // Attempt automatic AI refinement (will check provider availability internally) + attemptAiRefinement(steps[currentStepIndex], error.message || 'Step execution failed'); } finally { setIsExecuting(false); } - }, [runStep, runner, localTest.steps, currentStepIndex, aiAvailable, attemptAiRefinement]); + }, [runStep, runner, localTest.steps, currentStepIndex, attemptAiRefinement]); // Add goTo step at the specified index const addGoToStep = useCallback((url, insertIndex) => { From 67308ca9ec3f601ab9fc23712f4ed298a493d5de Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Fri, 12 Dec 2025 21:59:11 -0800 Subject: [PATCH 85/90] Refactor buildRefinementPrompt for improved readability: format JSON stringification and enhance task guidelines --- common/src/refineStep.js | 87 ++++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/common/src/refineStep.js b/common/src/refineStep.js index ff7009b..b346256 100644 --- a/common/src/refineStep.js +++ b/common/src/refineStep.js @@ -57,7 +57,9 @@ const buildRefinementPrompt = ({ const sections = []; // Current step - sections.push("## Step to Refine\n```json\n" + JSON.stringify(step, null, 2) + "\n```"); + sections.push( + "## Step to Refine\n```json\n" + JSON.stringify(step, null, 2) + "\n```" + ); // Failure message if present if (failureMessage) { @@ -66,15 +68,23 @@ const buildRefinementPrompt = ({ // Source content if present if (sourceContent) { - const truncatedSource = truncateContent(sourceContent, Math.floor(maxContextLength / 3)); + const truncatedSource = truncateContent( + sourceContent, + Math.floor(maxContextLength / 3) + ); sections.push("## Source Documentation\n" + truncatedSource); } // Previous steps if present if (previousSteps && previousSteps.length > 0) { const stepsJson = JSON.stringify(previousSteps, null, 2); - const truncatedSteps = truncateContent(stepsJson, Math.floor(maxContextLength / 4)); - sections.push("## Previously Executed Steps\n```json\n" + truncatedSteps + "\n```"); + const truncatedSteps = truncateContent( + stepsJson, + Math.floor(maxContextLength / 4) + ); + sections.push( + "## Previously Executed Steps\n```json\n" + truncatedSteps + "\n```" + ); } // Additional context @@ -82,37 +92,61 @@ const buildRefinementPrompt = ({ const contextSections = []; if (context.dom) { - const truncatedDom = truncateContent(context.dom, Math.floor(maxContextLength / 3)); - contextSections.push("### Browser DOM\n```html\n" + truncatedDom + "\n```"); + const truncatedDom = truncateContent( + context.dom, + Math.floor(maxContextLength / 3) + ); + contextSections.push( + "### Browser DOM\n```html\n" + truncatedDom + "\n```" + ); } if (context.element) { const truncatedElement = truncateContent( - typeof context.element === "string" ? context.element : JSON.stringify(context.element, null, 2), + typeof context.element === "string" + ? context.element + : JSON.stringify(context.element, null, 2), Math.floor(maxContextLength / 4) ); - contextSections.push("### Target Element\n```\n" + truncatedElement + "\n```"); + contextSections.push( + "### Target Element\n```\n" + truncatedElement + "\n```" + ); } if (context.cliOutput) { - const truncatedCli = truncateContent(context.cliOutput, Math.floor(maxContextLength / 4)); + const truncatedCli = truncateContent( + context.cliOutput, + Math.floor(maxContextLength / 4) + ); contextSections.push("### CLI Output\n```\n" + truncatedCli + "\n```"); } if (context.httpResponse) { - const responseStr = typeof context.httpResponse === "string" - ? context.httpResponse - : JSON.stringify(context.httpResponse, null, 2); - const truncatedHttp = truncateContent(responseStr, Math.floor(maxContextLength / 4)); - contextSections.push("### HTTP Response\n```json\n" + truncatedHttp + "\n```"); + const responseStr = + typeof context.httpResponse === "string" + ? context.httpResponse + : JSON.stringify(context.httpResponse, null, 2); + const truncatedHttp = truncateContent( + responseStr, + Math.floor(maxContextLength / 4) + ); + contextSections.push( + "### HTTP Response\n```json\n" + truncatedHttp + "\n```" + ); } if (context.accessibility) { - const accessStr = typeof context.accessibility === "string" - ? context.accessibility - : JSON.stringify(context.accessibility, null, 2); - const truncatedAccess = truncateContent(accessStr, Math.floor(maxContextLength / 4)); - contextSections.push("### Accessibility Tree\n```\n" + truncatedAccess + "\n```"); + const accessStr = + typeof context.accessibility === "string" + ? context.accessibility + : JSON.stringify(context.accessibility, null, 2); + const truncatedAccess = truncateContent( + accessStr, + Math.floor(maxContextLength / 4) + ); + contextSections.push( + "### Accessibility Tree\n```\n" + truncatedAccess + "\n```" + ); } if (contextSections.length > 0) { @@ -120,7 +154,14 @@ const buildRefinementPrompt = ({ } } - sections.push("## Task\nRefine the step above to make it pass based on the provided context. Return only the refined step object."); + sections.push( + "## Task\nRefine the step above to make it pass based on the provided context. Return only the refined step object.", + "## Guidelines", + "- Maintain the original intent of the step while fixing issues.", + "- For element-related steps, locate elements using properties in the following order of precedence: elementText (element display text) > elementAria (element ARIA label) > elementId (id attribute) > elementTestId (data-testid attribute) > elementAttributes (arbitrary attributes) > elementClass > selector.", + "- Avoid finding elements by selector if other properties can be used.", + "- Ensure all required fields are present and valid." + ); return sections.join("\n\n"); }; @@ -230,9 +271,11 @@ const refineStep = async ({ const refinedStep = postProcessStep(result.object, step); // Validate the step against the schema - const validation = validate({schemaKey: "step_v3", object: refinedStep}); + const validation = validate({ schemaKey: "step_v3", object: refinedStep }); if (!validation.valid) { - throw new Error(`Refined step failed validation: ${JSON.stringify(validation.errors)}`); + throw new Error( + `Refined step failed validation: ${JSON.stringify(validation.errors)}` + ); } return refinedStep; From 79300c1ea12360d9fcbcb48acf789523bca57111 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 15 Dec 2025 19:36:52 -0800 Subject: [PATCH 86/90] Review responses --- cli/.github/workflows/auto-dev-release.yml | 2 +- cli/.github/workflows/npm-test.yaml | 4 +- cli/scripts/bump-sync-version-core.js | 8 ++++ cli/src/cli/builder/TestEditor.mjs | 40 ++++++++++++------- cli/src/cli/runner.js | 6 +-- cli/src/index.js | 6 +-- common/src/ai.js | 4 +- common/src/refineStep.js | 2 +- .../sourceLocation_v3.schema.json | 16 +++++++- 9 files changed, 61 insertions(+), 27 deletions(-) diff --git a/cli/.github/workflows/auto-dev-release.yml b/cli/.github/workflows/auto-dev-release.yml index c7a4c07..f3e33f0 100644 --- a/cli/.github/workflows/auto-dev-release.yml +++ b/cli/.github/workflows/auto-dev-release.yml @@ -90,7 +90,7 @@ jobs: - name: Install dependencies if: steps.check_changes.outputs.skip_release == 'false' - run: npm install + run: npm ci - name: Run tests if: steps.check_changes.outputs.skip_release == 'false' diff --git a/cli/.github/workflows/npm-test.yaml b/cli/.github/workflows/npm-test.yaml index 3afe1e3..bcc9968 100644 --- a/cli/.github/workflows/npm-test.yaml +++ b/cli/.github/workflows/npm-test.yaml @@ -40,7 +40,7 @@ jobs: cache: 'npm' cache-dependency-path: package-lock.json - - run: npm install + - run: npm ci - run: npm test publish-npm: @@ -57,7 +57,7 @@ jobs: cache-dependency-path: package-lock.json registry-url: https://registry.npmjs.org/ - - run: npm install + - run: npm ci - run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/cli/scripts/bump-sync-version-core.js b/cli/scripts/bump-sync-version-core.js index 5fe86e9..5fe40d3 100755 --- a/cli/scripts/bump-sync-version-core.js +++ b/cli/scripts/bump-sync-version-core.js @@ -19,6 +19,14 @@ function execCommand(command, options = {}) { } function main() { + // Guard: Only run in CI environment to prevent accidental local execution + if (!process.env.CI) { + console.error("Error: This script should only be run in a CI environment."); + console.error("It performs destructive git operations (commits, tags, pushes)."); + console.error("Set CI=true environment variable to bypass this check if you know what you're doing."); + process.exit(1); + } + // Clean git state execCommand("git checkout -- ."); execCommand("git clean -fd"); diff --git a/cli/src/cli/builder/TestEditor.mjs b/cli/src/cli/builder/TestEditor.mjs index dc4ccb2..9b0e592 100644 --- a/cli/src/cli/builder/TestEditor.mjs +++ b/cli/src/cli/builder/TestEditor.mjs @@ -9,7 +9,6 @@ import SelectInput from 'ink-select-input'; import { getTestFields, validateTest, - createDefaultStep, getCommonStepProperties, getStepTypes, } from './schemaUtils.mjs'; @@ -31,18 +30,20 @@ const TestEditor = ({ const [view, setView] = useState('menu'); // 'menu', 'editMeta', 'editStep', 'addStep', 'preview', 'confirmCancel' const [editingField, setEditingField] = useState(null); const [editingStepIndex, setEditingStepIndex] = useState(null); - const [localTest, setLocalTest] = useState(test); + // Ensure we have a safe test object even if `test` is undefined/null + const safeTest = test || { description: '', steps: [] }; + const [localTest, setLocalTest] = useState(safeTest); // Track original test for detecting changes - const [originalTest] = useState(() => JSON.parse(JSON.stringify(test))); + const [originalTest] = useState(() => JSON.parse(JSON.stringify(safeTest))); // Track if there are unsaved changes const hasUnsavedChanges = useMemo(() => { return JSON.stringify(localTest) !== JSON.stringify(originalTest); }, [localTest, originalTest]); - // Get test fields - const { fields: testFields } = useMemo(() => getTestFields(), []); + // Get test fields (default to empty array if util returns nothing) + const { fields: testFields = [] } = useMemo(() => getTestFields() || {}, []); // Validation const validation = useMemo(() => validateTest(localTest), [localTest]); @@ -156,8 +157,8 @@ const TestEditor = ({ // Add step view if (view === 'addStep') { - // Create new step with step editor (it will prompt for type) - const newStep = createDefaultStep(); + // Create new step - pass empty object so StepEditor will prompt for type selection + const newStep = {}; return React.createElement(StepEditor, { step: newStep, @@ -227,10 +228,14 @@ const TestEditor = ({ return localTest[f.name] !== undefined; }); - const items = deletableFields.map((f) => ({ - label: `🗑️ ${f.name}: ${String(localTest[f.name]).substring(0, 30)}`, - value: f.name, - })); + const items = deletableFields.map((f) => { + const val = localTest[f.name]; + const preview = typeof val === 'object' ? JSON.stringify(val) : String(val); + return { + label: `🗑️ ${f.name}: ${preview.substring(0, 30)}`, + value: f.name, + }; + }); return React.createElement( Box, @@ -278,7 +283,14 @@ const TestEditor = ({ React.createElement( Box, { marginTop: 1 }, - React.createElement(Text, { color: 'red' }, 'Validation errors: ' + validation.errors) + React.createElement( + Text, + { color: 'red' }, + 'Validation errors: ' + + (Array.isArray(validation.errors) + ? JSON.stringify(validation.errors, null, 2) + : String(validation.errors)) + ) ), React.createElement( Box, @@ -332,8 +344,8 @@ const TestEditor = ({ }); // Get common step properties and valid step types once for reuse - const commonStepProps = Object.keys(getCommonStepProperties()); - const validStepTypes = getStepTypes(); + const commonStepProps = Object.keys(getCommonStepProperties() || {}); + const validStepTypes = getStepTypes() || []; steps.forEach((step, index) => { // Determine step type by finding a key that is a valid step type (not a common property) diff --git a/cli/src/cli/runner.js b/cli/src/cli/runner.js index ebda73f..9ba4f76 100644 --- a/cli/src/cli/runner.js +++ b/cli/src/cli/runner.js @@ -69,10 +69,10 @@ async function runWithUI(config, options = {}) { })); // Wait for React to flush the completed state to the screen - // Uses requestAnimationFrame to ensure the paint cycle completes + // Uses setImmediate to ensure the event loop processes pending I/O await new Promise((resolve) => { - requestAnimationFrame(() => { - requestAnimationFrame(resolve); + setImmediate(() => { + setImmediate(resolve); }); }); diff --git a/cli/src/index.js b/cli/src/index.js index 14a31e6..fa231fd 100755 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -358,11 +358,11 @@ async function main(argv) { const config = await setConfig({ configPath: configPath, args: argv }); log( - `CLI:VERSION INFO:\n${JSON.stringify(getVersionData(), null, 2)}`, + config, "debug", - config + `CLI:VERSION INFO:\n${JSON.stringify(getVersionData(), null, 2)}` ); - log(`CLI:CONFIG:\n${JSON.stringify(config, null, 2)}`, "debug", config); + log(config, "debug", `CLI:CONFIG:\n${JSON.stringify(config, null, 2)}`); // Check for DOC_DETECTIVE_API environment variable let api = await getResolvedTestsFromEnv(config); diff --git a/common/src/ai.js b/common/src/ai.js index 9a0782f..d3cfb59 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -592,9 +592,9 @@ const getApiKey = (config, provider) => { if ( provider === "openai" && - (process.env.OPENAI_API_KEY || config.integrations.openai) + (process.env.OPENAI_API_KEY || config.integrations.openAi) ) { - return process.env.OPENAI_API_KEY || config.integrations.openai.apiKey; + return process.env.OPENAI_API_KEY || config.integrations.openAi.apiKey; } if ( diff --git a/common/src/refineStep.js b/common/src/refineStep.js index b346256..93fbfd0 100644 --- a/common/src/refineStep.js +++ b/common/src/refineStep.js @@ -234,7 +234,7 @@ const refineStep = async ({ } // Extract AI configuration (support both legacy config.ai and new config.integrations) - const aiConfig = {}; + const aiConfig = config?.ai || {}; const resolvedModel = model || aiConfig.model; const baseURL = aiConfig.baseURL; diff --git a/common/src/schemas/output_schemas/sourceLocation_v3.schema.json b/common/src/schemas/output_schemas/sourceLocation_v3.schema.json index a94b9b3..ee974aa 100644 --- a/common/src/schemas/output_schemas/sourceLocation_v3.schema.json +++ b/common/src/schemas/output_schemas/sourceLocation_v3.schema.json @@ -5,6 +5,7 @@ "type": "object", "readOnly": true, "additionalProperties": false, + "required": ["file", "startLine", "endLine"], "properties": { "file": { "type": "string", @@ -64,7 +65,7 @@ "default": false, "readOnly": true }, - "commentFormat": { + "commentFormat": { "type": "string", "description": "The comment format used for this inline test or step. Used when serializing edits back to the source file.", "enum": [ @@ -75,6 +76,19 @@ "readOnly": true } }, + "allOf": [ + { + "if": { + "properties": { + "isInline": { "const": true } + }, + "required": ["isInline"] + }, + "then": { + "required": ["commentFormat"] + } + } + ], "examples": [ { "file": "/path/to/docs/getting-started.md", From ebab9f949a41cad6cca8f5158a1cb0d19dc02cd9 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 15 Dec 2025 19:48:40 -0800 Subject: [PATCH 87/90] Fix CI --- cli/.github/workflows/auto-dev-release.yml | 2 +- cli/.github/workflows/npm-test.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/.github/workflows/auto-dev-release.yml b/cli/.github/workflows/auto-dev-release.yml index f3e33f0..2f80718 100644 --- a/cli/.github/workflows/auto-dev-release.yml +++ b/cli/.github/workflows/auto-dev-release.yml @@ -90,7 +90,7 @@ jobs: - name: Install dependencies if: steps.check_changes.outputs.skip_release == 'false' - run: npm ci + run: npm install // Intentionally changed from 'npm ci' to 'npm install' to fix CI - name: Run tests if: steps.check_changes.outputs.skip_release == 'false' diff --git a/cli/.github/workflows/npm-test.yaml b/cli/.github/workflows/npm-test.yaml index bcc9968..901b7f8 100644 --- a/cli/.github/workflows/npm-test.yaml +++ b/cli/.github/workflows/npm-test.yaml @@ -40,7 +40,7 @@ jobs: cache: 'npm' cache-dependency-path: package-lock.json - - run: npm ci + - run: npm install // Intentionally changed from 'npm ci' to 'npm install' to fix CI - run: npm test publish-npm: From 1d9e2120b41d863babc89270dcaaa56bcc5d61ae Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Wed, 17 Dec 2025 09:42:42 -0800 Subject: [PATCH 88/90] Refactor TestEditor component and update schema - Replace Text components with Box for better layout in TestEditor. - Add progress tracking comments in runWithUI function for future enhancements. - Implement sortKeys function for consistent object key comparison. - Update generate function to use detected baseURL if provided. - Change commentFormat in sourceLocation schema from "htmlComment" to "linkReference". --- cli/src/cli/builder/TestEditor.mjs | 20 ++++++++++++----- cli/src/cli/runner.js | 5 +++++ cli/src/index.js | 22 +++++++++++++++++-- common/src/ai.js | 4 ++-- .../sourceLocation_v3.schema.json | 2 +- 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/cli/src/cli/builder/TestEditor.mjs b/cli/src/cli/builder/TestEditor.mjs index 9b0e592..5885163 100644 --- a/cli/src/cli/builder/TestEditor.mjs +++ b/cli/src/cli/builder/TestEditor.mjs @@ -203,9 +203,13 @@ const TestEditor = ({ React.createElement(Text, { bold: true, color: 'cyan' }, 'Select property to add:') ), React.createElement( - Text, - { color: 'gray', dimColor: true, marginBottom: 1 }, - '(Esc to go back)' + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to go back)' + ) ), React.createElement(ScrollableSelect, { items, @@ -249,9 +253,13 @@ const TestEditor = ({ React.createElement(Text, { bold: true, color: 'red' }, 'Select property to delete:') ), React.createElement( - Text, - { color: 'gray', dimColor: true, marginBottom: 1 }, - '(Esc to go back)' + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray', dimColor: true }, + '(Esc to go back)' + ) ), React.createElement(SelectInput, { items, diff --git a/cli/src/cli/runner.js b/cli/src/cli/runner.js index 9ba4f76..e9e2f3e 100644 --- a/cli/src/cli/runner.js +++ b/cli/src/cli/runner.js @@ -26,6 +26,11 @@ async function runWithUI(config, options = {}) { error: null, currentSpec: null, currentTest: null, + // Note: Progress tracking fields are initialized for future use when + // doc-detective-core adds progress callback support. Currently, runTests() + // does not provide progress callbacks, so these values remain at initial state + // during execution. The UI shows phase transitions (initializing → running → completed) + // rather than granular progress. progress: { specs: { current: 0, total: 0 }, tests: { current: 0, total: 0 }, diff --git a/cli/src/index.js b/cli/src/index.js index fa231fd..4a2d3f5 100755 --- a/cli/src/index.js +++ b/cli/src/index.js @@ -31,6 +31,24 @@ function computeFileHash(filePath) { } } +/** + * Recursively sort all object keys for consistent comparison. + * @param {*} obj - The value to sort keys for + * @returns {*} The value with all object keys sorted + */ +function sortKeys(obj) { + if (obj === null || typeof obj !== 'object') { + return obj; + } + if (Array.isArray(obj)) { + return obj.map(sortKeys); + } + return Object.keys(obj).sort().reduce((result, key) => { + result[key] = sortKeys(obj[key]); + return result; + }, {}); +} + /** * Canonicalize a spec object for content comparison. * Removes volatile fields like sourcePath, contentPath, specId that don't affect spec content. @@ -43,8 +61,8 @@ function canonicalizeSpec(spec) { delete clone.sourcePath; delete clone.contentPath; delete clone.specId; - // Sort keys for consistent comparison - return JSON.stringify(clone, Object.keys(clone).sort()); + // Recursively sort all object keys for consistent comparison + return JSON.stringify(sortKeys(clone)); } /** diff --git a/common/src/ai.js b/common/src/ai.js index d3cfb59..d4e281c 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -673,7 +673,7 @@ const generate = async ({ const providerFactory = createProvider({ provider: detected.provider, apiKey: detected.apiKey, - baseURL, + baseURL: baseURL || detected.baseURL, }); // Get model instance @@ -856,7 +856,7 @@ const generateWithSchemaValidation = async ({ // Schema validation failed, store error for retry lastError = validation.errors; - lastObject = result.object; + lastObject = validationObject; if (attempt === MAX_SCHEMA_VALIDATION_RETRIES) { throw new Error( diff --git a/common/src/schemas/output_schemas/sourceLocation_v3.schema.json b/common/src/schemas/output_schemas/sourceLocation_v3.schema.json index ee974aa..b7b7ef6 100644 --- a/common/src/schemas/output_schemas/sourceLocation_v3.schema.json +++ b/common/src/schemas/output_schemas/sourceLocation_v3.schema.json @@ -114,7 +114,7 @@ "originalText": "[example link](https://example.com)", "isInline": true, "isAutoDetected": true, - "commentFormat": "htmlComment" + "commentFormat": "linkReference" } ] } \ No newline at end of file From 4cc8b7f47e6d4dfeb2055473be87e586fbdb58ce Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 12 Jan 2026 19:57:12 -0800 Subject: [PATCH 89/90] Add unit tests for parsers module - Create a new test file for the parsers module. - Implement tests for detecting file formats including markdown, MDX, reStructuredText, AsciiDoc, DITA, XML, and HTML. - Add tests for the `getParser` function to ensure correct parser retrieval based on format. - Write tests for each parsing function: `parseMarkdown`, `parseMdx`, `parseAsciidoc`, `parseDitaXml`, `parseHtml`, and `parseNaive`. - Validate chunk structure, ensuring properties like content and source location are present. - Include edge case tests for long documents, special characters, Unicode content, and mixed line endings. --- common/src/ai.js | 11 +- common/src/index.js | 7 +- common/src/ollama.js | 4 +- common/test/ai.test.js | 18 +- core/test/temp-dom-timeout-test.json | 17 + .../test/temp-screenshot-regression-test.json | 18 + resolver/local-llm/llama.cpp | 1 - resolver/package-lock.json | 2853 +++++++++++++++-- resolver/package.json | 13 +- resolver/src/analyze.js | 274 ++ resolver/src/analyze.test.js | 582 +++- resolver/src/index.js | 28 +- resolver/src/parsers.js | 979 ++++++ resolver/src/parsers.test.js | 887 +++++ 14 files changed, 5347 insertions(+), 345 deletions(-) create mode 100644 core/test/temp-dom-timeout-test.json create mode 100644 core/test/temp-screenshot-regression-test.json delete mode 160000 resolver/local-llm/llama.cpp create mode 100644 resolver/src/parsers.js create mode 100644 resolver/src/parsers.test.js diff --git a/common/src/ai.js b/common/src/ai.js index d4e281c..21fd114 100644 --- a/common/src/ai.js +++ b/common/src/ai.js @@ -8,7 +8,7 @@ const Ajv = require("ajv"); const addFormats = require("ajv-formats"); const { ensureModelAvailable, isOllamaAvailable, DEFAULT_OLLAMA_BASE_URL } = require("./ollama"); -const DEFAULT_MODEL = "ollama/qwen3-vl:8b"; +const DEFAULT_MODEL = "ollama/qwen3:4b"; const MAX_SCHEMA_VALIDATION_RETRIES = 3; /** @@ -27,10 +27,9 @@ const modelMap = { "google/gemini-2.5-flash": "gemini-2.5-flash", "google/gemini-2.5-pro": "gemini-2.5-pro", "google/gemini-3-pro": "gemini-3-pro-preview", - // Ollama models - "ollama/qwen3-vl:8b": "qwen3-vl:8b-instruct-q4_K_M", - "ollama/qwen3-vl:4b": "qwen3-vl:4b-instruct-q4_K_M", - "ollama/qwen3-vl:2b": "qwen3-vl:2b-instruct-q4_K_M", + // Ollama models (text models that support standard chat API) + "ollama/qwen3:4b": "qwen3:4b", + "ollama/qwen3:8b": "qwen3:8b", "ollama/gemma3:4bq4": "gemma3:4b-it-q4_K_M", "ollama/gemma3:4bq8": "gemma3:4b-it-q8_0", "ollama/gemma3:12bq4": "gemma3:12b-it-q4_K_M", @@ -68,7 +67,7 @@ const getDefaultProvider = async (config = {}) => { // Local, no API key needed return { provider: "ollama", - model: modelMap["ollama/qwen3-vl:8b"], + model: modelMap["ollama/qwen3:4b"], apiKey: null, baseURL: ollamaBaseUrl || undefined, }; diff --git a/common/src/index.js b/common/src/index.js index eab5c17..7dcd860 100644 --- a/common/src/index.js +++ b/common/src/index.js @@ -2,7 +2,7 @@ const { schemas } = require("./schemas"); const { validate, transformToSchemaKey } = require("./validate"); const { resolvePaths } = require("./resolvePaths"); const { readFile } = require("./files"); -const { generate, detectProvider, getApiKey, isOllamaAvailable, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); +const { generate, detectProvider, getApiKey, DEFAULT_MODEL, MAX_SCHEMA_VALIDATION_RETRIES } = require("./ai"); const { refineStep } = require("./refineStep"); const { DEFAULT_OLLAMA_MODEL, @@ -11,9 +11,10 @@ const { detectGpuType, startOllamaContainer, waitForOllama, - pullOllamaModel, stopOllamaContainer, ensureOllamaRunning, + isOllamaAvailable, + ensureModelAvailable, } = require("./ollama"); module.exports = { @@ -35,7 +36,7 @@ module.exports = { detectGpuType, startOllamaContainer, waitForOllama, - pullOllamaModel, + ensureModelAvailable, stopOllamaContainer, ensureOllamaRunning, }; diff --git a/common/src/ollama.js b/common/src/ollama.js index acda711..cfeb754 100644 --- a/common/src/ollama.js +++ b/common/src/ollama.js @@ -1,8 +1,8 @@ const { execSync, spawn } = require("child_process"); const fs = require("fs"); -/** Default Ollama model to use */ -const DEFAULT_OLLAMA_MODEL = "qwen3-vl:8b-instruct-q4_K_M"; +/** Default Ollama model to use (text model that supports standard chat API) */ +const DEFAULT_OLLAMA_MODEL = "qwen3:4b"; /** Timeout for checking Ollama availability */ const OLLAMA_AVAILABILITY_TIMEOUT_MS = 500; diff --git a/common/test/ai.test.js b/common/test/ai.test.js index 0e3743a..75d7ab3 100644 --- a/common/test/ai.test.js +++ b/common/test/ai.test.js @@ -63,8 +63,8 @@ describe("AI Module", function () { }); it("should contain Ollama model mappings", function () { - expect(modelMap["ollama/qwen3-vl:2b"]).to.equal("qwen3-vl:2b-instruct-q4_K_M"); - expect(modelMap["ollama/qwen3-vl:8b"]).to.equal("qwen3-vl:8b-instruct-q4_K_M"); + expect(modelMap["ollama/qwen3:4b"]).to.equal("qwen3:4b"); + expect(modelMap["ollama/qwen3:8b"]).to.equal("qwen3:8b"); }); it("should contain Google Gemini model mappings", function () { @@ -111,16 +111,16 @@ describe("AI Module", function () { it("should detect Ollama provider for known Ollama models", async function () { const config = {}; - const result = await detectProvider(config, "ollama/qwen3-vl:8b"); + const result = await detectProvider(config, "ollama/qwen3:4b"); expect(result.provider).to.equal("ollama"); - expect(result.model).to.equal("qwen3-vl:8b-instruct-q4_K_M"); + expect(result.model).to.equal("qwen3:4b"); expect(result.apiKey).to.be.null; expect(result.baseURL).to.equal("http://localhost:11434/api"); }); it("should use custom baseUrl from config for Ollama", async function () { const config = { integrations: { ollama: { baseUrl: "http://custom:11434/api" } } }; - const result = await detectProvider(config, "ollama/qwen3-vl:8b"); + const result = await detectProvider(config, "ollama/qwen3:4b"); expect(result.provider).to.equal("ollama"); expect(result.baseURL).to.equal("http://custom:11434/api"); }); @@ -229,7 +229,7 @@ describe("AI Module", function () { const result = await detectProvider(config, "unknown-model"); // Ollama should be preferred when available expect(result.provider).to.equal("ollama"); - expect(result.model).to.equal("qwen3-vl:8b-instruct-q4_K_M"); + expect(result.model).to.equal("qwen3:4b"); }); it("should return null values when model is known but no API key for that provider", async function () { @@ -243,8 +243,8 @@ describe("AI Module", function () { }); describe("DEFAULT_MODEL", function () { - it("should be ollama/qwen3-vl:8b", function () { - expect(DEFAULT_MODEL).to.equal("ollama/qwen3-vl:8b"); + it("should be ollama/qwen3:4b", function () { + expect(DEFAULT_MODEL).to.equal("ollama/qwen3:4b"); }); }); @@ -329,7 +329,7 @@ describe("AI Module", function () { try { const result = await generate({ prompt: "Reply with exactly one word: Yes", - model: "ollama/qwen3-vl:8b", + model: "ollama/qwen3:4b", maxTokens: 20, }); diff --git a/core/test/temp-dom-timeout-test.json b/core/test/temp-dom-timeout-test.json new file mode 100644 index 0000000..6e2f7e2 --- /dev/null +++ b/core/test/temp-dom-timeout-test.json @@ -0,0 +1,17 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": { + "url": "http://localhost:8092/waitUntil-test-dom-mutations-forever.html", + "timeout": 5000, + "waitUntil": { + "domIdleTime": 500 + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-screenshot-regression-test.json b/core/test/temp-screenshot-regression-test.json new file mode 100644 index 0000000..ea61e5d --- /dev/null +++ b/core/test/temp-screenshot-regression-test.json @@ -0,0 +1,18 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": "http://localhost:8092/drag-drop-test.html" + }, + { + "screenshot": { + "path": "C:\\Users\\hawkeyexl\\Documents\\Workspaces\\.github\\core\\test\\temp-regression-screenshot.png", + "maxVariation": 0.05, + "overwrite": "aboveVariation" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/resolver/local-llm/llama.cpp b/resolver/local-llm/llama.cpp deleted file mode 160000 index 392e09a..0000000 --- a/resolver/local-llm/llama.cpp +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 392e09a60852d0e879d4bbedd5ace3e6852f719e diff --git a/resolver/package-lock.json b/resolver/package-lock.json index 2bedfb5..c3d3e4c 100644 --- a/resolver/package-lock.json +++ b/resolver/package-lock.json @@ -11,11 +11,20 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", + "asciidoctor": "^3.0.4", "axios": "^1.13.2", - "doc-detective-common": "^3.7.0-preview.0", + "cheerio": "^1.0.0", + "doc-detective-common": "file:../common", "dotenv": "^17.2.3", + "fast-xml-parser": "^4.5.1", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.2" + "posthog-node": "^5.17.2", + "remark-mdx": "^3.1.0", + "remark-parse": "^11.0.0", + "tree-sitter-rst": "^0.2.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "web-tree-sitter": "^0.24.7" }, "devDependencies": { "body-parser": "^2.2.1", @@ -28,97 +37,240 @@ "yaml": "^2.8.2" } }, - "node_modules/@ai-sdk/anthropic": { - "version": "2.0.54", - "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.54.tgz", - "integrity": "sha512-6OSFMkt5NkAchH7o0W+dI2h6yR8EPXx7Yl6txyh0gadLlkf1UU/ScyoYlkxAW8UtGju/+apvwVTdLYEQuIsVVQ==", - "license": "Apache-2.0", + "../common": { + "name": "doc-detective-common", + "version": "3.7.0-preview.0", + "license": "AGPL-3.0-only", + "dependencies": { + "@ai-sdk/anthropic": "^2.0.54", + "@ai-sdk/google": "^3.0.0-beta.72", + "@ai-sdk/openai": "^2.0.80", + "@apidevtools/json-schema-ref-parser": "^15.1.3", + "ai": "^5.0.109", + "ajv": "^8.17.1", + "ajv-errors": "^3.0.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0", + "axios": "^1.13.2", + "ollama-ai-provider-v2": "^1.2.0", + "yaml": "^2.8.2", + "zod": "^4.1.13" + }, + "devDependencies": { + "chai": "^6.2.1", + "mocha": "^11.7.5", + "sinon": "^21.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", + "integrity": "sha512-XvEitlOaU8S+hOrMPuGyCjp6vC51K+syUN4HHrSUdSDLLWRWQJYjInU6xlSoRGCVBCfcoHxbRm+yiaYq2yFR5w==", + "license": "MIT", "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.18" + "js-yaml": "^4.1.1" }, "engines": { - "node": ">=18" + "node": ">=20" }, "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" + "@types/json-schema": "^7.0.15" } }, - "node_modules/@ai-sdk/gateway": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.18.tgz", - "integrity": "sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==", - "license": "Apache-2.0", + "node_modules/@asciidoctor/cli": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@asciidoctor/cli/-/cli-4.0.0.tgz", + "integrity": "sha512-x2T9gW42921Zd90juEagtbViPZHNP2MWf0+6rJEkOzW7E9m3TGJtz+Guye9J0gwrpZsTMGCpfYMQy1We3X7osg==", + "license": "MIT", "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.18", - "@vercel/oidc": "3.0.5" + "yargs": "17.3.1" + }, + "bin": { + "asciidoctor": "bin/asciidoctor", + "asciidoctorjs": "bin/asciidoctor" }, "engines": { - "node": ">=18" + "node": ">=16", + "npm": ">=8.0.0" }, "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" + "@asciidoctor/core": ">=2 <4" } }, - "node_modules/@ai-sdk/openai": { - "version": "2.0.80", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.80.tgz", - "integrity": "sha512-tNHuraF11db+8xJEDBoU9E3vMcpnHFKRhnLQ3DQX2LnEzfPB9DksZ8rE+yVuDN1WRW9cm2OWAhgHFgVKs7ICuw==", - "license": "Apache-2.0", + "node_modules/@asciidoctor/cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@asciidoctor/cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@asciidoctor/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/@asciidoctor/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.18" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=18" + "node": ">=8" + } + }, + "node_modules/@asciidoctor/cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" + "engines": { + "node": ">=8" } }, - "node_modules/@ai-sdk/provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", - "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", - "license": "Apache-2.0", + "node_modules/@asciidoctor/cli/node_modules/yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "license": "MIT", "dependencies": { - "json-schema": "^0.4.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@ai-sdk/provider-utils": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.18.tgz", - "integrity": "sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==", - "license": "Apache-2.0", + "node_modules/@asciidoctor/core": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-3.0.4.tgz", + "integrity": "sha512-41SDMi7iRRBViPe0L6VWFTe55bv6HEOJeRqMj5+E5wB1YPdUPuTucL4UAESPZM6OWmn4t/5qM5LusXomFUVwVQ==", + "license": "MIT", + "peer": true, "dependencies": { - "@ai-sdk/provider": "2.0.0", - "@standard-schema/spec": "^1.0.0", - "eventsource-parser": "^3.0.6" + "@asciidoctor/opal-runtime": "3.0.1", + "unxhr": "1.2.0" }, "engines": { - "node": ">=18" + "node": ">=16", + "npm": ">=8" + } + }, + "node_modules/@asciidoctor/opal-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@asciidoctor/opal-runtime/-/opal-runtime-3.0.1.tgz", + "integrity": "sha512-iW7ACahOG0zZft4A/4CqDcc7JX+fWRNjV5tFAVkNCzwZD+EnFolPaUOPYt8jzadc0+Bgd80cQTtRMQnaaV1kkg==", + "license": "MIT", + "dependencies": { + "glob": "8.1.0", + "unxhr": "1.2.0" }, - "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" + "engines": { + "node": ">=16" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "15.1.3", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-15.1.3.tgz", - "integrity": "sha512-XvEitlOaU8S+hOrMPuGyCjp6vC51K+syUN4HHrSUdSDLLWRWQJYjInU6xlSoRGCVBCfcoHxbRm+yiaYq2yFR5w==", + "node_modules/@asciidoctor/opal-runtime/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@asciidoctor/opal-runtime/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "license": "MIT", "dependencies": { - "js-yaml": "^4.1.1" + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=20" + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, - "peerDependencies": { - "@types/json-schema": "^7.0.15" + "engines": { + "node": ">=6.9.0" } }, "node_modules/@isaacs/cliui": { @@ -191,15 +343,6 @@ "jsep": "^0.4.0||^1.0.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -261,27 +404,72 @@ "node": ">=4" } }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "peer": true }, - "node_modules/@vercel/oidc": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz", - "integrity": "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==", - "license": "Apache-2.0", - "engines": { - "node": ">= 20" + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" } }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -319,22 +507,26 @@ "node": ">= 0.6" } }, - "node_modules/ai": { - "version": "5.0.109", - "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.109.tgz", - "integrity": "sha512-tW8K4Z0bcYH9PzP7gMmPilgBwgpylEL25bRtWruUnrTS45S6ryNJ6YSEh6mZajlIEDS6bcur7srdXVGERxjVXQ==", - "license": "Apache-2.0", - "dependencies": { - "@ai-sdk/gateway": "2.0.18", - "@ai-sdk/provider": "2.0.0", - "@ai-sdk/provider-utils": "3.0.18", - "@opentelemetry/api": "1.9.0" + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=18" - }, + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", "peerDependencies": { - "zod": "^3.25.76 || ^4.1.8" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/ajv": { @@ -353,44 +545,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -407,7 +561,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -418,11 +571,90 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/asciidoctor": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/asciidoctor/-/asciidoctor-3.0.4.tgz", + "integrity": "sha512-hIc0Bx73wePxtic+vWBHOIgMfKSNiCmRz7BBfkyykXATrw20YGd5a3CozCHvqEPH+Wxp5qKD4aBsgtokez8nEA==", + "license": "MIT", + "dependencies": { + "@asciidoctor/cli": "4.0.0", + "@asciidoctor/core": "3.0.4", + "ejs": "^3.1.2", + "handlebars": "^4.7.6", + "nunjucks": "^3.2.1", + "pug": "^3.0.0" + }, + "bin": { + "asciidoctor": "bin/asciidoctor", + "asciidoctorjs": "bin/asciidoctor" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + } + }, + "node_modules/asciidoctor/node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/assert-never": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", + "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -440,11 +672,45 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/body-parser": { "version": "2.2.1", @@ -471,16 +737,34 @@ "url": "https://opencollective.com/express" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -514,7 +798,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -545,6 +828,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chai": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", @@ -583,6 +876,97 @@ "node": ">=8" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "license": "MIT", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -672,7 +1056,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -683,8 +1066,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -698,6 +1080,25 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -774,11 +1175,38 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -792,6 +1220,19 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -811,6 +1252,28 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -822,22 +1285,68 @@ } }, "node_modules/doc-detective-common": { - "version": "3.7.0-preview.0", - "resolved": "https://registry.npmjs.org/doc-detective-common/-/doc-detective-common-3.7.0-preview.0.tgz", - "integrity": "sha512-13HnawzR0J5fIoUp5irvmooiU5LCLpOCiF8wf3UkpyqQIWlQ1gZhNH08YD6zGfgc3ddUmN+r965flucDbIGkaQ==", - "license": "AGPL-3.0-only", + "resolved": "../common", + "link": true + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { - "@ai-sdk/anthropic": "^2.0.54", - "@ai-sdk/openai": "^2.0.80", - "@apidevtools/json-schema-ref-parser": "^15.1.3", - "ai": "^5.0.109", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "ajv-keywords": "^5.1.0", - "axios": "^1.13.2", - "yaml": "^2.8.2", - "zod": "^4.1.13" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dotenv": { @@ -879,6 +1388,21 @@ "dev": true, "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -895,6 +1419,43 @@ "node": ">= 0.8" } }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -944,7 +1505,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -969,6 +1529,30 @@ "node": ">=4" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -979,15 +1563,6 @@ "node": ">= 0.6" } }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -1065,6 +1640,12 @@ "node": ">= 0.6" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1075,6 +1656,45 @@ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", @@ -1099,6 +1719,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", @@ -1209,19 +1842,38 @@ "node": ">= 0.6" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -1284,6 +1936,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1296,6 +1961,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1352,6 +2038,37 @@ "he": "bin/he" } }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -1390,11 +2107,21 @@ "url": "https://opencollective.com/express" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -1406,11 +2133,47 @@ "node": ">= 0.10" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -1422,15 +2185,77 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", @@ -1451,6 +2276,18 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -1458,6 +2295,24 @@ "dev": true, "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -1488,6 +2343,29 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", @@ -1505,16 +2383,11 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, "node_modules/json-schema-faker": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.9.tgz", @@ -1585,6 +2458,22 @@ "node": ">=18.0.0" } }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "license": "MIT", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/jstransformer/node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1624,6 +2513,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -1639,80 +2538,846 @@ "node": ">= 0.4" } }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">=16 || 14 >=14.17" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/mocha": { - "version": "11.7.5", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", - "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", - "dev": true, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs/node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, "license": "MIT", "dependencies": { "browser-stdout": "^1.3.1", @@ -1767,8 +3432,7 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/negotiator": { "version": "1.0.0", @@ -1780,6 +3444,63 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -1810,7 +3531,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -1860,6 +3580,80 @@ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", "dev": true }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1891,7 +3685,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { @@ -1920,56 +3713,201 @@ "node": ">=16" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/posthog-node": { + "version": "5.17.2", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", + "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", + "license": "MIT", + "dependencies": { + "@posthog/core": "1.7.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/proxyquire": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.1", + "resolve": "^1.11.1" + } + }, + "node_modules/pug": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "license": "MIT", + "dependencies": { + "pug-code-gen": "^3.0.3", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", + "license": "MIT" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "license": "MIT", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "license": "MIT", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } }, - "node_modules/posthog-node": { - "version": "5.17.2", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.17.2.tgz", - "integrity": "sha512-lz3YJOr0Nmiz0yHASaINEDHqoV+0bC3eD8aZAG+Ky292dAnVYul+ga/dMX8KCBXg8hHfKdxw0SztYD5j6dgUqQ==", + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "license": "MIT", "dependencies": { - "@posthog/core": "1.7.1" - }, - "engines": { - "node": ">=20" + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" + "pug-error": "^2.0.0", + "token-stream": "1.0.0" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "license": "MIT" }, - "node_modules/proxyquire": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", - "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", - "dev": true, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "license": "MIT", "dependencies": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.1", - "resolve": "^1.11.1" + "pug-error": "^2.0.0" } }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "license": "MIT" + }, "node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", @@ -2021,11 +3959,53 @@ "node": ">= 0.10" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2042,7 +4022,6 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -2100,7 +4079,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -2342,6 +4320,15 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2417,6 +4404,20 @@ "node": ">=8" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -2466,6 +4467,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -2485,7 +4498,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2494,6 +4506,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2504,6 +4529,44 @@ "node": ">=0.6" } }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", + "license": "MIT" + }, + "node_modules/tree-sitter-rst": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/tree-sitter-rst/-/tree-sitter-rst-0.2.0.tgz", + "integrity": "sha512-PKhicpBQcQsdt93mIDZiEaZjde1kONsgNwSW9ovTTowSUBVCtC2QfnGUJeK66v4++Trt+BQF1ahwUcJRev9e3g==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "funding": { + "url": "https://github.com/sponsors/stsewd" + }, + "peerDependencies": { + "tree-sitter": "^0.22.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -2552,6 +4615,115 @@ "node": ">= 0.6" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -2562,6 +4734,15 @@ "node": ">= 0.8" } }, + "node_modules/unxhr": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.2.0.tgz", + "integrity": "sha512-6cGpm8NFXPD9QbSNx0cD2giy7teZ6xOkCUH3U89WKVkL9N9rBrWjlCwhR94Re18ZlAop4MOc3WU1M3Hv/bgpIw==", + "license": "MIT", + "engines": { + "node": ">=8.11" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2572,6 +4753,104 @@ "node": ">= 0.8" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/web-tree-sitter": { + "version": "0.24.7", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.7.tgz", + "integrity": "sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ==", + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, "node_modules/workerpool": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", @@ -2583,7 +4862,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2659,7 +4937,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2667,14 +4944,12 @@ "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2688,7 +4963,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2699,14 +4973,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -2715,6 +4987,7 @@ "version": "2.8.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -2748,7 +5021,6 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "engines": { "node": ">=12" } @@ -2842,13 +5114,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", - "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "license": "MIT", "funding": { - "url": "https://github.com/sponsors/colinhacks" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } } } diff --git a/resolver/package.json b/resolver/package.json index c896fee..cf8dc12 100644 --- a/resolver/package.json +++ b/resolver/package.json @@ -26,11 +26,20 @@ "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.1.3", "ajv": "^8.17.1", + "asciidoctor": "^3.0.4", "axios": "^1.13.2", - "doc-detective-common": "^3.7.0-preview.0", + "cheerio": "^1.0.0", + "doc-detective-common": "file:../common", "dotenv": "^17.2.3", + "fast-xml-parser": "^4.5.1", "json-schema-faker": "^0.5.9", - "posthog-node": "^5.17.2" + "posthog-node": "^5.17.2", + "remark-mdx": "^3.1.0", + "remark-parse": "^11.0.0", + "tree-sitter-rst": "^0.2.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "web-tree-sitter": "^0.24.7" }, "devDependencies": { "body-parser": "^2.2.1", diff --git a/resolver/src/analyze.js b/resolver/src/analyze.js index a6bbe05..abc0f10 100644 --- a/resolver/src/analyze.js +++ b/resolver/src/analyze.js @@ -1,8 +1,54 @@ const { generate, schemas, validate } = require("doc-detective-common"); const crypto = require("crypto"); +const { parseDocument, detectFormat } = require("./parsers"); const DEFAULT_MAX_CONTENT_LENGTH = 100000; +/** + * Schema for actionability classification. + * Used to determine if a chunk contains instructions for users to perform testable actions. + */ +const ACTIONABILITY_SCHEMA = { + type: "object", + properties: { + isActionable: { + type: "boolean", + description: + "Whether this content instructs the user to perform testable actions", + }, + reason: { + type: "string", + description: + "Brief explanation of why the content is or is not actionable", + }, + }, + required: ["isActionable", "reason"], +}; + +/** + * System prompt for classifying content actionability. + */ +const ACTIONABILITY_SYSTEM_PROMPT = `You are a documentation analysis expert. Your task is to determine if a piece of documentation content instructs users to perform testable actions. + +Content is ACTIONABLE if it contains instructions for users to: +- Navigate to URLs or web pages +- Click buttons, links, or UI elements +- Type or enter text into forms or fields +- Run shell/terminal commands +- Make HTTP/API requests +- Execute code examples +- Perform specific interactions with a user interface +- Follow step-by-step procedures that can be automated + +Content is NOT ACTIONABLE if it: +- Only provides conceptual explanations or background information +- Contains only reference material without procedures +- Discusses features without showing how to use them +- Contains only code snippets shown for illustration without execution instructions +- Is purely descriptive text about architecture or design + +Be conservative - only mark content as actionable if there are clear, specific actions a user would perform that can be tested automatically.`; + /** * System prompt for analyzing documentation and generating test specifications. */ @@ -208,11 +254,239 @@ const analyze = async ({ return finalTest; }; +/** + * Check if a content chunk is actionable (contains testable instructions). + * + * @param {Object} options - Options + * @param {string} options.content - The chunk content to check + * @param {string} [options.heading] - The heading of this chunk for context + * @param {Object} [options.config] - Doc Detective configuration object + * @returns {Promise<{isActionable: boolean, reason: string}>} Actionability result + */ +const checkActionability = async ({ content, heading, config = {} }) => { + const prompt = heading + ? `Analyze the following documentation section titled "${heading}":\n\n${content}` + : `Analyze the following documentation content:\n\n${content}`; + + try { + const result = await generate({ + prompt, + system: ACTIONABILITY_SYSTEM_PROMPT, + schema: ACTIONABILITY_SCHEMA, + schemaName: "actionability", + schemaDescription: "Classification of whether content is actionable", + config, + }); + + return result.object; + } catch (error) { + // On error, assume not actionable to be conservative + return { + isActionable: false, + reason: `Failed to check actionability: ${error.message}`, + }; + } +}; + +/** + * Analyzes a document by breaking it into semantic chunks, identifying actionable content, + * and generating test specifications for each actionable chunk. + * + * @param {Object} options - Analysis options + * @param {string} options.content - Raw document content to analyze (required) + * @param {string} options.filePath - Path to the source file (required for format detection) + * @param {Object} [options.config] - Doc Detective configuration object + * @param {number} [options.chunkLevel=2] - Heading level to chunk at (1-6, default H2) + * @param {number} [options.maxContentLength] - Maximum content length per chunk before truncation + * @param {Array} [options.files] - Optional images/screenshots to include for multimodal analysis + * @returns {Promise} A promise that resolves to a spec_v3 compatible specification + * @throws {Error} If content or filePath is not provided + * + * @example + * const spec = await analyzeDocument({ + * content: fs.readFileSync('docs/guide.md', 'utf8'), + * filePath: 'docs/guide.md', + * config: { integrations: { anthropic: { apiKey: "sk-..." } } } + * }); + */ +const analyzeDocument = async ({ + content, + filePath, + config = {}, + chunkLevel = 2, + maxContentLength = DEFAULT_MAX_CONTENT_LENGTH, + files, +}) => { + // Validate required inputs + if (!content || typeof content !== "string") { + throw new Error("'content' is required and must be a string."); + } + if (!filePath || typeof filePath !== "string") { + throw new Error("'filePath' is required and must be a string."); + } + + // Simple logging helper + const log = (level, message) => { + const logLevel = config.logLevel || "info"; + const levels = ["error", "warning", "info", "debug"]; + const currentLevelIndex = levels.indexOf(logLevel); + const messageLevelIndex = levels.indexOf(level); + if (messageLevelIndex <= currentLevelIndex) { + console.log(`(${level.toUpperCase()}) ${message}`); + } + }; + + // Parse document into semantic chunks + log("info", `Parsing document: ${filePath}`); + const format = detectFormat(filePath); + log("debug", `Detected format: ${format}`); + + const chunks = await parseDocument(content, filePath, { chunkLevel }); + log("info", `Found ${chunks.length} chunk(s) in document`); + + if (chunks.length === 0) { + log("info", "No chunks found in document, returning empty spec"); + const emptySpec = { + specId: generateId("spec"), + description: `Generated from ${filePath}`, + contentPath: filePath, + tests: [], + }; + + const validation = validate({ + schemaKey: "spec_v3", + object: emptySpec, + addDefaults: false, + }); + + // If empty tests array is not valid, we need at least one test + // But per spec_v3 schema, tests requires minItems: 1 + // Return the spec anyway with a warning + log("info", "Document produced no actionable chunks"); + return emptySpec; + } + + // Check actionability for all chunks in parallel + log("info", "Checking chunk actionability in parallel..."); + const actionabilityResults = await Promise.all( + chunks.map(async (chunk, index) => { + try { + const result = await checkActionability({ + content: chunk.content, + heading: chunk.heading, + config, + }); + return { index, chunk, ...result }; + } catch (error) { + log( + "info", + `Skipping chunk ${index + 1} (actionability check failed): ${error.message}` + ); + return { index, chunk, isActionable: false, reason: error.message }; + } + }) + ); + + // Filter to actionable chunks + const actionableChunks = actionabilityResults.filter((r) => r.isActionable); + log( + "info", + `${actionableChunks.length} of ${chunks.length} chunk(s) are actionable` + ); + + if (actionableChunks.length === 0) { + log("info", "No actionable chunks found, returning spec with empty tests"); + const emptySpec = { + specId: generateId("spec"), + description: `Generated from ${filePath}`, + contentPath: filePath, + tests: [], + }; + return emptySpec; + } + + // Analyze actionable chunks in parallel to generate tests + log("info", "Generating tests for actionable chunks..."); + const testResults = await Promise.all( + actionableChunks.map(async ({ index, chunk }) => { + try { + // Build description from heading if available + const description = chunk.heading + ? `${chunk.heading} - Generated from ${filePath}` + : `Chunk ${index + 1} - Generated from ${filePath}`; + + const test = await analyze({ + content: chunk.content, + filePath, + config, + maxContentLength, + files, + test: { + description, + sourceLocation: { + file: filePath, + ...chunk.sourceLocation, + isInline: false, + isAutoDetected: true, + }, + }, + }); + + return { success: true, test, index }; + } catch (error) { + log( + "info", + `Skipping chunk ${index + 1} (test generation failed): ${error.message}` + ); + return { success: false, error: error.message, index }; + } + }) + ); + + // Collect successful tests + const tests = testResults + .filter((r) => r.success) + .map((r) => r.test); + + log("info", `Successfully generated ${tests.length} test(s)`); + + // Build the spec + const spec = { + specId: generateId("spec"), + description: `Generated from ${filePath}`, + contentPath: filePath, + tests, + }; + + // Validate if we have tests + if (tests.length > 0) { + const validation = validate({ + schemaKey: "spec_v3", + object: spec, + addDefaults: false, + }); + + if (!validation.valid) { + log( + "warning", + `Generated spec failed validation: ${JSON.stringify(validation.errors)}` + ); + // Return anyway - caller can decide what to do + } + } + + return spec; +}; + module.exports = { analyze, + analyzeDocument, + checkActionability, buildAnalysisPrompt, postProcessTest, ANALYSIS_SYSTEM_PROMPT, + ACTIONABILITY_SCHEMA, + ACTIONABILITY_SYSTEM_PROMPT, DEFAULT_MAX_CONTENT_LENGTH, }; diff --git a/resolver/src/analyze.test.js b/resolver/src/analyze.test.js index abfba7f..ec14018 100644 --- a/resolver/src/analyze.test.js +++ b/resolver/src/analyze.test.js @@ -1,22 +1,64 @@ const crypto = require("crypto"); +const { + ensureOllamaRunning, + stopOllamaContainer, + isOllamaAvailable, + ensureModelAvailable, + MODEL_PULL_TIMEOUT_MS, +} = require("doc-detective-common"); + // Import the analyze module const { analyze, + analyzeDocument, + checkActionability, buildAnalysisPrompt, postProcessTest, ANALYSIS_SYSTEM_PROMPT, + ACTIONABILITY_SCHEMA, + ACTIONABILITY_SYSTEM_PROMPT, DEFAULT_MAX_CONTENT_LENGTH, } = require("./analyze"); +// Track if we started the container +let weStartedOllama = false; +// Track if Ollama is available for AI-dependent tests +let ollamaAvailable = false; + before(async function () { const { expect } = await import("chai"); global.expect = expect; }); describe("Analyze Module", function () { - // Increase timeout for real API calls - this.timeout(120000); + // Increase timeout for real API calls and container setup + this.timeout(MODEL_PULL_TIMEOUT_MS + 60000); + + before(async function () { + console.log(" Setting up Ollama for tests..."); + // Track if we need to start the container + const wasAlreadyRunning = await isOllamaAvailable(); + ollamaAvailable = await ensureOllamaRunning(); + if (!ollamaAvailable) { + console.warn("Warning: Ollama is not available. Some tests may be skipped."); + } else { + // Ensure the model is available (might already be running but model not pulled) + const modelReady = await ensureModelAvailable({ model: "qwen3:4b" }); + if (!modelReady) { + console.warn("Warning: Could not ensure model availability. Some tests may be skipped."); + ollamaAvailable = false; + } + } + weStartedOllama = !wasAlreadyRunning && ollamaAvailable; + }); + + after(async function () { + if (weStartedOllama) { + console.log("Cleaning up Ollama container..."); + await stopOllamaContainer(); + } + }); describe("buildAnalysisPrompt", function () { it("should build prompt with content only", function () { @@ -375,8 +417,8 @@ describe("Analyze Module", function () { describe("test generation", function () { it("should generate a valid test from simple documentation", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -400,8 +442,8 @@ Make sure the API endpoint https://api.example.com/health returns a 200 status.` }); it("should include file info when filePath is provided", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -415,8 +457,8 @@ Make sure the API endpoint https://api.example.com/health returns a 200 status.` }); it("should use model from config when provided", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -424,7 +466,7 @@ Make sure the API endpoint https://api.example.com/health returns a 200 status.` content: "Navigate to https://example.com and click the button.", config: { ai: { - model: "anthropic/claude-haiku-4.5", + model: "ollama/qwen3:4b", }, }, }); @@ -434,8 +476,8 @@ Make sure the API endpoint https://api.example.com/health returns a 200 status.` }); it("should override config model with explicit model parameter", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -443,10 +485,10 @@ Make sure the API endpoint https://api.example.com/health returns a 200 status.` content: "Check that https://example.com returns 200.", config: { ai: { - model: "anthropic/claude-opus-4.5", // This should be overridden + model: "ollama/qwen3:8b", // This should be overridden }, }, - model: "anthropic/claude-haiku-4.5", // Use cheaper model + model: "ollama/qwen3:4b", // Use different model }); expect(test).to.be.an("object"); @@ -454,8 +496,8 @@ Make sure the API endpoint https://api.example.com/health returns a 200 status.` }); it("should generate steps with appropriate action types", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -478,8 +520,8 @@ The response should have a 200 status code.`; }); it("should handle maxContentLength parameter", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -497,8 +539,8 @@ The response should have a 200 status code.`; describe("test validation", function () { it("should produce tests that pass schema validation", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -515,8 +557,8 @@ The response should have a 200 status code.`; describe("partial test input", function () { it("should preserve testId from partial test", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -534,8 +576,8 @@ The response should have a 200 status code.`; }); it("should preserve description from partial test", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -551,8 +593,8 @@ The response should have a 200 status code.`; }); it("should preserve contentPath from partial test", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -568,8 +610,8 @@ The response should have a 200 status code.`; }); it("should preserve setup and cleanup from partial test", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -587,8 +629,8 @@ The response should have a 200 status code.`; }); it("should expand partial test with incomplete steps", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -611,8 +653,8 @@ Finally, fill in the registration form.`, }); it("should generate valid test when partial test provided", async function () { - // Skip if no API key is set - if (!process.env.ANTHROPIC_API_KEY) { + // Skip if Ollama is not available + if (!ollamaAvailable) { this.skip(); } @@ -634,4 +676,482 @@ Finally, fill in the registration form.`, }); }); }); + + describe("ACTIONABILITY_SCHEMA", function () { + it("should define isActionable as required boolean", function () { + expect(ACTIONABILITY_SCHEMA.type).to.equal("object"); + expect(ACTIONABILITY_SCHEMA.properties.isActionable.type).to.equal("boolean"); + expect(ACTIONABILITY_SCHEMA.required).to.include("isActionable"); + }); + + it("should define reason as required string", function () { + expect(ACTIONABILITY_SCHEMA.properties.reason.type).to.equal("string"); + expect(ACTIONABILITY_SCHEMA.required).to.include("reason"); + }); + }); + + describe("ACTIONABILITY_SYSTEM_PROMPT", function () { + it("should contain actionability classification context", function () { + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("documentation analysis expert"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("testable actions"); + }); + + it("should describe actionable content types", function () { + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("Navigate to URLs"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("Click buttons"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("Run shell/terminal commands"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("HTTP/API requests"); + }); + + it("should describe non-actionable content types", function () { + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("conceptual explanations"); + expect(ACTIONABILITY_SYSTEM_PROMPT).to.include("reference material"); + }); + }); + + describe("checkActionability", function () { + describe("input handling", function () { + it("should accept content parameter", async function () { + // This test verifies the function signature works + // Actual AI call is tested in integration tests + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Navigate to https://example.com and click the button.", + }); + + expect(result).to.be.an("object"); + expect(result).to.have.property("isActionable"); + expect(result).to.have.property("reason"); + expect(result.isActionable).to.be.a("boolean"); + expect(result.reason).to.be.a("string"); + }); + + it("should accept heading parameter for context", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Follow these steps to get started.", + heading: "Getting Started", + }); + + expect(result).to.be.an("object"); + expect(result).to.have.property("isActionable"); + }); + }); + + describe("actionability classification", function () { + it("should identify actionable content with URLs", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Navigate to https://example.com and click the Login button.", + }); + + expect(result.isActionable).to.be.true; + }); + + it("should identify actionable content with commands", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Run the following command in your terminal:\n\n```bash\nnpm install doc-detective\n```", + }); + + expect(result.isActionable).to.be.true; + }); + + it("should identify non-actionable conceptual content", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Doc Detective is a documentation testing framework. It was designed to help teams maintain accurate documentation.", + }); + + expect(result.isActionable).to.be.false; + }); + + it("should return reason for classification", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const result = await checkActionability({ + content: "Go to https://example.com", + }); + + expect(result.reason).to.be.a("string"); + expect(result.reason.length).to.be.greaterThan(0); + }); + }); + + describe("error handling", function () { + it("should return not actionable on error", async function () { + // Force an error by providing invalid config + const result = await checkActionability({ + content: "Test content", + config: { + ai: { + apiKey: "invalid-key-that-will-fail", + }, + }, + }); + + expect(result).to.be.an("object"); + expect(result.isActionable).to.be.false; + }); + }); + }); + + describe("analyzeDocument", function () { + describe("input validation", function () { + it("should throw error when content is not provided", async function () { + try { + await analyzeDocument({ filePath: "/docs/test.md" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + + it("should throw error when content is not a string", async function () { + try { + await analyzeDocument({ content: 123, filePath: "/docs/test.md" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'content' is required and must be a string."); + } + }); + + it("should throw error when filePath is not provided", async function () { + try { + await analyzeDocument({ content: "Test content" }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'filePath' is required and must be a string."); + } + }); + + it("should throw error when filePath is not a string", async function () { + try { + await analyzeDocument({ content: "Test content", filePath: 123 }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.equal("'filePath' is required and must be a string."); + } + }); + }); + + describe("document parsing", function () { + it("should parse markdown documents", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `# Getting Started + +## Step 1: Navigate + +Go to https://example.com to begin. + +## Step 2: Login + +Click the **Login** button.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/getting-started.md", + }); + + expect(spec).to.be.an("object"); + expect(spec).to.have.property("specId"); + expect(spec).to.have.property("contentPath"); + expect(spec.contentPath).to.equal("/docs/getting-started.md"); + }); + + it("should throw for empty documents", async function () { + try { + await analyzeDocument({ + content: "", + filePath: "/docs/empty.md", + }); + expect.fail("Should have thrown an error"); + } catch (error) { + expect(error.message).to.include("content"); + } + }); + }); + + describe("chunk processing", function () { + it("should process document chunks", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Action Section + +Navigate to https://example.com and click the button. + +## Reference Section + +This section describes the architecture of the system.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/mixed.md", + }); + + expect(spec).to.be.an("object"); + expect(spec).to.have.property("tests"); + expect(spec.tests).to.be.an("array"); + }); + + it("should respect chunkLevel option", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `# Main Title + +## Section + +### Subsection + +Navigate to https://example.com. + +### Another Subsection + +Click the button.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/nested.md", + chunkLevel: 3, + }); + + expect(spec).to.be.an("object"); + }); + }); + + describe("spec generation", function () { + it("should generate valid spec with specId", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Quick Start + +Run the following command: + +\`\`\`bash +npm install doc-detective +\`\`\``; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/quickstart.md", + }); + + expect(spec.specId).to.be.a("string"); + expect(spec.specId.length).to.be.greaterThan(0); + }); + + it("should include contentPath in spec", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Test Section + +Navigate to https://example.com`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/test.md", + }); + + expect(spec.contentPath).to.equal("/docs/test.md"); + }); + + it("should generate tests array", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Actionable Section + +1. Go to https://example.com +2. Click the **Submit** button +3. Verify the success message appears`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/steps.md", + }); + + expect(spec.tests).to.be.an("array"); + // May or may not have tests depending on AI classification + }); + + it("should return empty tests array when no actionable content", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Architecture Overview + +This document describes the high-level architecture of the system. + +The system consists of three main components: +- Frontend +- Backend +- Database + +These components communicate via REST APIs.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/architecture.md", + }); + + expect(spec).to.be.an("object"); + expect(spec.tests).to.be.an("array"); + // Tests array may be empty if no actionable content found + }); + }); + + describe("test content", function () { + it("should include sourceLocation in generated tests", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Login Flow + +Navigate to https://example.com/login and enter your credentials.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/login.md", + }); + + if (spec.tests.length > 0) { + const test = spec.tests[0]; + expect(test).to.have.property("sourceLocation"); + expect(test.sourceLocation).to.have.property("file"); + expect(test.sourceLocation.file).to.equal("/docs/login.md"); + } + }); + + it("should generate tests with steps", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## API Testing + +Make a GET request to https://api.example.com/users. +Verify the response status is 200.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/api.md", + }); + + if (spec.tests.length > 0) { + expect(spec.tests[0]).to.have.property("steps"); + expect(spec.tests[0].steps).to.be.an("array"); + } + }); + }); + + describe("error handling", function () { + it("should skip chunks that fail actionability check gracefully", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + // Even with valid content, the function should handle any internal errors + const content = `## Valid Section + +Navigate to https://example.com. + +## Another Section + +Click the button.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/multi.md", + config: { logLevel: "silent" }, + }); + + expect(spec).to.be.an("object"); + }); + + it("should skip chunks that fail test generation gracefully", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Test Section + +Follow these steps to test the feature.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/test.md", + config: { logLevel: "silent" }, + }); + + // Should not throw, should return spec (possibly with empty tests) + expect(spec).to.be.an("object"); + }); + }); + + describe("format detection", function () { + it("should detect markdown format from file extension", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `## Markdown Section + +Content here.`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/guide.md", + }); + + expect(spec).to.be.an("object"); + }); + + it("should detect HTML format from file extension", async function () { + if (!ollamaAvailable) { + this.skip(); + } + + const content = `

HTML Section

+

Navigate to Example.

`; + + const spec = await analyzeDocument({ + content, + filePath: "/docs/page.html", + }); + + expect(spec).to.be.an("object"); + }); + }); + }); }); diff --git a/resolver/src/index.js b/resolver/src/index.js index ef6cf78..1fd5713 100644 --- a/resolver/src/index.js +++ b/resolver/src/index.js @@ -1,13 +1,39 @@ const { setConfig } = require("./config"); const { qualifyFiles, parseTests, log } = require("./utils"); const { resolveDetectedTests } = require("./resolve"); -const { analyze } = require("./analyze"); +const { analyze, analyzeDocument, checkActionability } = require("./analyze"); +const { + parseDocument, + parseMarkdown, + parseMdx, + parseRst, + parseAsciidoc, + parseDitaXml, + parseHtml, + parseNaive, + detectFormat, + getParser, +} = require("./parsers"); // const { telemetryNotice, sendTelemetry } = require("./telem"); exports.detectTests = detectTests; exports.resolveTests = resolveTests; exports.detectAndResolveTests = detectAndResolveTests; exports.analyze = analyze; +exports.analyzeDocument = analyzeDocument; +exports.checkActionability = checkActionability; + +// Parser exports +exports.parseDocument = parseDocument; +exports.parseMarkdown = parseMarkdown; +exports.parseMdx = parseMdx; +exports.parseRst = parseRst; +exports.parseAsciidoc = parseAsciidoc; +exports.parseDitaXml = parseDitaXml; +exports.parseHtml = parseHtml; +exports.parseNaive = parseNaive; +exports.detectFormat = detectFormat; +exports.getParser = getParser; // const supportMessage = ` // ########################################################################## diff --git a/resolver/src/parsers.js b/resolver/src/parsers.js new file mode 100644 index 0000000..56414c9 --- /dev/null +++ b/resolver/src/parsers.js @@ -0,0 +1,979 @@ +const { unified } = require("unified"); +const remarkParse = require("remark-parse"); +const remarkMdx = require("remark-mdx"); +const { visit } = require("unist-util-visit"); +const { load: cheerioLoad } = require("cheerio"); +const { XMLParser } = require("fast-xml-parser"); +const path = require("path"); + +/** + * @typedef {Object} Chunk + * @property {string} content - The text content of the chunk + * @property {string} [heading] - The heading/title of this section (if any) + * @property {Object} sourceLocation - Source location information + * @property {number} sourceLocation.startLine - 1-based start line + * @property {number} sourceLocation.endLine - 1-based end line + * @property {number} sourceLocation.startColumn - 1-based start column + * @property {number} sourceLocation.endColumn - 1-based end column + * @property {number} sourceLocation.startOffset - 0-based character offset + * @property {number} sourceLocation.endOffset - 0-based character offset + */ + +/** + * Default chunk level for section splitting (H2 equivalent) + */ +const DEFAULT_CHUNK_LEVEL = 2; + +/** + * Tree-sitter parser instance (lazily initialized) + */ +let treeSitterParser = null; +let rstLanguage = null; + +/** + * Initialize the tree-sitter parser for rST (lazy initialization) + * @returns {Promise} The initialized parser + */ +const initTreeSitterRst = async () => { + if (treeSitterParser && rstLanguage) { + return { parser: treeSitterParser, language: rstLanguage }; + } + + const Parser = require("web-tree-sitter"); + await Parser.init(); + treeSitterParser = new Parser(); + + // Load the RST language - tree-sitter-rst should provide a .wasm file + // or we need to locate it in node_modules + const rstPath = require.resolve("tree-sitter-rst"); + const rstDir = path.dirname(rstPath); + const wasmPath = path.join(rstDir, "tree-sitter-rst.wasm"); + + try { + rstLanguage = await Parser.Language.load(wasmPath); + treeSitterParser.setLanguage(rstLanguage); + } catch (error) { + // Fallback: try to find .wasm in different locations + const altWasmPath = path.join(rstDir, "tree_sitter_rst.wasm"); + try { + rstLanguage = await Parser.Language.load(altWasmPath); + treeSitterParser.setLanguage(rstLanguage); + } catch (innerError) { + throw new Error( + `Failed to load tree-sitter-rst WASM: ${error.message}. ` + + `Tried paths: ${wasmPath}, ${altWasmPath}` + ); + } + } + + return { parser: treeSitterParser, language: rstLanguage }; +}; + +/** + * Convert AST position to sourceLocation object + * @param {Object} position - AST position with line/column info + * @param {string} content - Full document content + * @returns {Object} Source location object + */ +const positionToSourceLocation = (position, content) => { + const startLine = position.start?.line ?? 1; + const endLine = position.end?.line ?? startLine; + const startColumn = position.start?.column ?? 1; + const endColumn = position.end?.column ?? 1; + const startOffset = position.start?.offset ?? 0; + const endOffset = position.end?.offset ?? content.length; + + return { + startLine, + endLine, + startColumn, + endColumn, + startOffset, + endOffset, + }; +}; + +/** + * Calculate source location from line numbers + * @param {number} startLine - 1-based start line + * @param {number} endLine - 1-based end line + * @param {string} content - Full document content + * @returns {Object} Source location object + */ +const lineNumbersToSourceLocation = (startLine, endLine, content) => { + const lines = content.split("\n"); + let startOffset = 0; + let endOffset = content.length; + + // Calculate start offset + for (let i = 0; i < startLine - 1 && i < lines.length; i++) { + startOffset += lines[i].length + 1; // +1 for newline + } + + // Calculate end offset + endOffset = 0; + for (let i = 0; i < endLine && i < lines.length; i++) { + endOffset += lines[i].length + 1; + } + endOffset = Math.min(endOffset, content.length); + + return { + startLine, + endLine, + startColumn: 1, + endColumn: lines[endLine - 1]?.length + 1 || 1, + startOffset, + endOffset, + }; +}; + +/** + * Extract text content from mdast nodes + * @param {Object} node - mdast node + * @returns {string} Text content + */ +const extractMdastText = (node) => { + if (node.type === "text") { + return node.value; + } + if (node.children) { + return node.children.map(extractMdastText).join(""); + } + return ""; +}; + +/** + * Serialize mdast node back to markdown-ish text + * @param {Object} node - mdast node + * @param {string} content - Original content for fallback + * @returns {string} Serialized content + */ +const serializeMdastNode = (node, content) => { + if (node.position) { + return content.slice(node.position.start.offset, node.position.end.offset); + } + return extractMdastText(node); +}; + +/** + * Parse Markdown content into semantic chunks at H2 level + * @param {string} content - Markdown content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at (1-6) + * @returns {Promise} Array of chunks + */ +const parseMarkdown = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + + try { + const processor = unified().use(remarkParse); + const tree = processor.parse(content); + + const chunks = []; + let currentChunk = null; + let currentHeading = null; + let currentNodes = []; + + const flushChunk = (endPosition) => { + if (currentNodes.length > 0) { + const startPos = currentNodes[0].position?.start || { line: 1, column: 1, offset: 0 }; + const endPos = endPosition || currentNodes[currentNodes.length - 1].position?.end || { line: 1, column: 1, offset: content.length }; + + const chunkContent = content.slice(startPos.offset, endPos.offset); + + if (chunkContent.trim()) { + chunks.push({ + content: chunkContent, + heading: currentHeading, + sourceLocation: { + startLine: startPos.line, + endLine: endPos.line, + startColumn: startPos.column, + endColumn: endPos.column, + startOffset: startPos.offset, + endOffset: endPos.offset, + }, + }); + } + } + currentNodes = []; + currentHeading = null; + }; + + for (const node of tree.children) { + if (node.type === "heading" && node.depth <= chunkLevel) { + // Flush previous chunk before starting new section + if (currentNodes.length > 0) { + flushChunk(node.position?.start); + } + currentHeading = extractMdastText(node); + currentNodes = [node]; + } else { + currentNodes.push(node); + } + } + + // Flush final chunk + flushChunk(); + + // If no chunks were created, return the whole document as one chunk + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse MDX content into semantic chunks at H2 level + * @param {string} content - MDX content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at (1-6) + * @returns {Promise} Array of chunks + */ +const parseMdx = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + + try { + const processor = unified().use(remarkParse).use(remarkMdx); + const tree = processor.parse(content); + + const chunks = []; + let currentHeading = null; + let currentNodes = []; + + const flushChunk = (endPosition) => { + if (currentNodes.length > 0) { + const startPos = currentNodes[0].position?.start || { line: 1, column: 1, offset: 0 }; + const endPos = endPosition || currentNodes[currentNodes.length - 1].position?.end || { line: 1, column: 1, offset: content.length }; + + const chunkContent = content.slice(startPos.offset, endPos.offset); + + if (chunkContent.trim()) { + chunks.push({ + content: chunkContent, + heading: currentHeading, + sourceLocation: { + startLine: startPos.line, + endLine: endPos.line, + startColumn: startPos.column, + endColumn: endPos.column, + startOffset: startPos.offset, + endOffset: endPos.offset, + }, + }); + } + } + currentNodes = []; + currentHeading = null; + }; + + for (const node of tree.children) { + if (node.type === "heading" && node.depth <= chunkLevel) { + if (currentNodes.length > 0) { + flushChunk(node.position?.start); + } + currentHeading = extractMdastText(node); + currentNodes = [node]; + } else { + currentNodes.push(node); + } + } + + flushChunk(); + + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse reStructuredText content into semantic chunks using tree-sitter + * @param {string} content - rST content + * @param {Object} [options] - Parser options + * @returns {Promise} Array of chunks + */ +const parseRst = async (content, options = {}) => { + try { + const { parser } = await initTreeSitterRst(); + const tree = parser.parse(content); + + const chunks = []; + const sections = []; + + // Collect all section nodes + const collectSections = (node) => { + if (node.type === "section") { + const titleNode = node.children.find((c) => c.type === "title"); + sections.push({ + node, + title: titleNode ? content.slice(titleNode.startIndex, titleNode.endIndex).trim() : null, + startIndex: node.startIndex, + endIndex: node.endIndex, + startPosition: node.startPosition, + endPosition: node.endPosition, + }); + } + for (const child of node.children) { + collectSections(child); + } + }; + + collectSections(tree.rootNode); + + if (sections.length === 0) { + // No sections found, return whole document + if (content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + return chunks; + } + + // Calculate section boundaries + for (let i = 0; i < sections.length; i++) { + const section = sections[i]; + const nextSection = sections[i + 1]; + + const endOffset = nextSection ? nextSection.startIndex : content.length; + const chunkContent = content.slice(section.startIndex, endOffset); + + if (chunkContent.trim()) { + chunks.push({ + content: chunkContent, + heading: section.title, + sourceLocation: { + startLine: section.startPosition.row + 1, + endLine: nextSection + ? nextSection.startPosition.row + : content.split("\n").length, + startColumn: section.startPosition.column + 1, + endColumn: 1, + startOffset: section.startIndex, + endOffset: endOffset, + }, + }); + } + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse AsciiDoc content into semantic chunks + * @param {string} content - AsciiDoc content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Section level to chunk at (1-5) + * @returns {Promise} Array of chunks + */ +const parseAsciidoc = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + + try { + const asciidoctor = require("asciidoctor")(); + const doc = asciidoctor.load(content, { sourcemap: true }); + + const chunks = []; + + /** + * Recursively process blocks to find sections + * @param {Object} block - AsciiDoc block + * @param {number} depth - Current depth + */ + const processBlock = (block, depth = 0) => { + const context = block.getContext ? block.getContext() : null; + + if (context === "section") { + const level = block.getLevel ? block.getLevel() : 0; + + // Only chunk at the specified level or higher (lower number = higher in hierarchy) + if (level > 0 && level <= chunkLevel) { + const title = block.getTitle ? block.getTitle() : null; + const sourceLocation = block.getSourceLocation + ? block.getSourceLocation() + : null; + + // Get the content of this section + let sectionContent = ""; + if (sourceLocation) { + const startLine = sourceLocation.getLineNumber + ? sourceLocation.getLineNumber() + : 1; + const lines = content.split("\n"); + // Find where this section ends (next section at same or higher level, or end of doc) + let endLine = lines.length; + + // Simple heuristic: look for next heading at same or higher level + const headingPattern = new RegExp(`^={1,${level}}\\s+`); + for (let i = startLine; i < lines.length; i++) { + if (headingPattern.test(lines[i]) && i > startLine) { + endLine = i; + break; + } + } + + sectionContent = lines.slice(startLine - 1, endLine).join("\n"); + const loc = lineNumbersToSourceLocation(startLine, endLine, content); + + if (sectionContent.trim()) { + chunks.push({ + content: sectionContent, + heading: title, + sourceLocation: loc, + }); + } + } + } + } + + // Process child blocks + if (block.getBlocks) { + const blocks = block.getBlocks(); + for (const child of blocks) { + processBlock(child, depth + 1); + } + } + }; + + // Process sections from the document + if (doc.getSections) { + const sections = doc.getSections(); + for (const section of sections) { + processBlock(section, 0); + } + } + + // If no chunks were created, return the whole document + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: doc.getTitle ? doc.getTitle() : null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse DITA/XML content into semantic chunks + * @param {string} content - DITA/XML content + * @param {Object} [options] - Parser options + * @returns {Promise} Array of chunks + */ +const parseDitaXml = async (content, options = {}) => { + try { + const parser = new XMLParser({ + ignoreAttributes: false, + attributeNamePrefix: "@_", + preserveOrder: true, + commentPropName: "#comment", + trimValues: false, + }); + + const result = parser.parse(content); + const chunks = []; + + /** + * Find section-like elements in DITA/XML + * DITA section elements: topic, concept, task, reference, section + * Generic XML: section, div with id/class + */ + const sectionElements = [ + "topic", + "concept", + "task", + "reference", + "troubleshooting", + "section", + "taskbody", + "conbody", + "refbody", + ]; + + /** + * Extract text content from parsed XML node + * @param {Object|Array} node - Parsed XML node + * @returns {string} Text content + */ + const extractText = (node) => { + if (typeof node === "string") return node; + if (Array.isArray(node)) return node.map(extractText).join(""); + if (typeof node === "object") { + let text = ""; + for (const [key, value] of Object.entries(node)) { + if (key === "#text") { + text += value; + } else if (!key.startsWith("@_") && !key.startsWith("#")) { + text += extractText(value); + } + } + return text; + } + return ""; + }; + + /** + * Find title element in a DITA node + * @param {Object|Array} node - Parsed XML node + * @returns {string|null} Title text or null + */ + const findTitle = (node) => { + if (Array.isArray(node)) { + for (const item of node) { + if (item.title) { + return extractText(item.title); + } + } + } else if (typeof node === "object" && node.title) { + return extractText(node.title); + } + return null; + }; + + /** + * Walk the XML tree to find sections + * @param {Object|Array} node - Current node + * @param {number} depth - Current depth + */ + const walkXml = (node, depth = 0) => { + if (Array.isArray(node)) { + for (const item of node) { + walkXml(item, depth); + } + } else if (typeof node === "object") { + for (const [key, value] of Object.entries(node)) { + if (sectionElements.includes(key)) { + const title = findTitle(value); + const textContent = extractText(value); + + if (textContent.trim()) { + // For XML, we estimate line numbers since fast-xml-parser doesn't provide them + // This is a limitation - we'll use offset-based estimation + chunks.push({ + content: textContent, + heading: title, + sourceLocation: { + startLine: 1, + endLine: 1, + startColumn: 1, + endColumn: 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + } else if (!key.startsWith("@_") && !key.startsWith("#")) { + walkXml(value, depth + 1); + } + } + } + }; + + walkXml(result, 0); + + // If no chunks were created, return the whole document + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Parse HTML content into semantic chunks + * @param {string} content - HTML content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at (1-6) + * @returns {Promise} Array of chunks + */ +const parseHtml = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + + try { + const $ = cheerioLoad(content); + const chunks = []; + + // Build selector for section boundaries + const headingSelectors = []; + for (let i = 1; i <= chunkLevel; i++) { + headingSelectors.push(`h${i}`); + } + const sectionSelectors = ["section", "article", "main"]; + + // Find all headings at or above chunk level + const headings = $(headingSelectors.join(", ")).toArray(); + + if (headings.length === 0) { + // No headings found - try sections + const sections = $(sectionSelectors.join(", ")).toArray(); + + if (sections.length > 0) { + for (const section of sections) { + const $section = $(section); + const title = + $section.find("h1, h2, h3, h4, h5, h6").first().text() || null; + const text = $section.text(); + + if (text.trim()) { + chunks.push({ + content: $.html(section), + heading: title, + sourceLocation: { + startLine: 1, + endLine: 1, + startColumn: 1, + endColumn: 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + } + } else { + // No sections either - return whole body + const bodyContent = $("body").length ? $("body").html() : content; + if (bodyContent && bodyContent.trim()) { + chunks.push({ + content: bodyContent, + heading: $("title").text() || null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + } + } else { + // Process headings as section boundaries + for (let i = 0; i < headings.length; i++) { + const heading = headings[i]; + const $heading = $(heading); + const title = $heading.text(); + + // Collect content until next heading + let sectionContent = $.html(heading); + let current = $heading.next(); + + while (current.length > 0) { + const tagName = current.prop("tagName")?.toLowerCase(); + // Stop at next heading of same or higher level + if (tagName && /^h[1-6]$/.test(tagName)) { + const level = parseInt(tagName.charAt(1), 10); + if (level <= chunkLevel) { + break; + } + } + sectionContent += $.html(current); + current = current.next(); + } + + if (sectionContent.trim()) { + chunks.push({ + content: sectionContent, + heading: title, + sourceLocation: { + startLine: 1, + endLine: 1, + startColumn: 1, + endColumn: 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + } + } + + // If still no chunks, return whole document + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: content.split("\n").length, + startColumn: 1, + endColumn: content.split("\n").pop().length + 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; + } catch (error) { + // Fall back to naive parsing on error + return parseNaive(content, options); + } +}; + +/** + * Naive parsing fallback - splits on heading patterns or blank lines + * @param {string} content - Document content + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at + * @returns {Promise} Array of chunks + */ +const parseNaive = async (content, options = {}) => { + const chunkLevel = options.chunkLevel ?? DEFAULT_CHUNK_LEVEL; + const chunks = []; + + // Try to detect heading patterns + // Markdown: # Heading, ## Heading, etc. + // rST: underlines with =, -, ~, etc. + // AsciiDoc: = Heading, == Heading, etc. + const lines = content.split("\n"); + + // Markdown/AsciiDoc heading pattern (# or =) + const mdHeadingPattern = new RegExp(`^#{1,${chunkLevel}}\\s+(.+)$`); + const adocHeadingPattern = new RegExp(`^={1,${chunkLevel}}\\s+(.+)$`); + + // rST section detection (title followed by underline) + const rstUnderlineChars = ["=", "-", "~", "^", '"', "'", "`", ":"]; + + let currentChunkLines = []; + let currentHeading = null; + let chunkStartLine = 1; + + const flushChunk = (endLine) => { + if (currentChunkLines.length > 0) { + const chunkContent = currentChunkLines.join("\n"); + if (chunkContent.trim()) { + const loc = lineNumbersToSourceLocation( + chunkStartLine, + endLine, + content + ); + chunks.push({ + content: chunkContent, + heading: currentHeading, + sourceLocation: loc, + }); + } + } + currentChunkLines = []; + currentHeading = null; + }; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const lineNum = i + 1; + + // Check for Markdown heading + const mdMatch = line.match(mdHeadingPattern); + if (mdMatch) { + flushChunk(lineNum - 1); + chunkStartLine = lineNum; + currentHeading = mdMatch[1]; + currentChunkLines.push(line); + continue; + } + + // Check for AsciiDoc heading + const adocMatch = line.match(adocHeadingPattern); + if (adocMatch) { + flushChunk(lineNum - 1); + chunkStartLine = lineNum; + currentHeading = adocMatch[1]; + currentChunkLines.push(line); + continue; + } + + // Check for rST-style heading (previous line is title, current is underline) + if (i > 0 && line.length > 0) { + const underlineChar = line.charAt(0); + if ( + rstUnderlineChars.includes(underlineChar) && + line === underlineChar.repeat(line.length) && + lines[i - 1].trim().length > 0 && + line.length >= lines[i - 1].trim().length + ) { + // This is an rST heading underline + // Remove the title line from current chunk and start new chunk + const titleLine = currentChunkLines.pop(); + flushChunk(lineNum - 2); + chunkStartLine = lineNum - 1; + currentHeading = titleLine?.trim() || null; + currentChunkLines.push(titleLine || ""); + currentChunkLines.push(line); + continue; + } + } + + currentChunkLines.push(line); + } + + // Flush final chunk + flushChunk(lines.length); + + // If no chunks were created, return whole document as one chunk + if (chunks.length === 0 && content.trim()) { + chunks.push({ + content: content, + heading: null, + sourceLocation: { + startLine: 1, + endLine: lines.length, + startColumn: 1, + endColumn: lines[lines.length - 1]?.length + 1 || 1, + startOffset: 0, + endOffset: content.length, + }, + }); + } + + return chunks; +}; + +/** + * Detect document format from file extension + * @param {string} filePath - Path to the file + * @returns {string} Format identifier: 'markdown', 'mdx', 'rst', 'asciidoc', 'dita', 'xml', 'html', or 'unknown' + */ +const detectFormat = (filePath) => { + const ext = path.extname(filePath).toLowerCase(); + + const formatMap = { + ".md": "markdown", + ".markdown": "markdown", + ".mdx": "mdx", + ".rst": "rst", + ".rest": "rst", + ".adoc": "asciidoc", + ".asciidoc": "asciidoc", + ".asc": "asciidoc", + ".dita": "dita", + ".ditamap": "dita", + ".xml": "xml", + ".html": "html", + ".htm": "html", + ".xhtml": "html", + }; + + return formatMap[ext] || "unknown"; +}; + +/** + * Get the appropriate parser function for a format + * @param {string} format - Format identifier from detectFormat() + * @returns {Function} Parser function + */ +const getParser = (format) => { + const parserMap = { + markdown: parseMarkdown, + mdx: parseMdx, + rst: parseRst, + asciidoc: parseAsciidoc, + dita: parseDitaXml, + xml: parseDitaXml, + html: parseHtml, + unknown: parseNaive, + }; + + return parserMap[format] || parseNaive; +}; + +/** + * Parse a document into semantic chunks using the appropriate parser + * @param {string} content - Document content + * @param {string} filePath - Path to the file (used for format detection) + * @param {Object} [options] - Parser options + * @param {number} [options.chunkLevel=2] - Heading level to chunk at + * @returns {Promise} Array of chunks + */ +const parseDocument = async (content, filePath, options = {}) => { + const format = detectFormat(filePath); + const parser = getParser(format); + return parser(content, options); +}; + +module.exports = { + parseMarkdown, + parseMdx, + parseRst, + parseAsciidoc, + parseDitaXml, + parseHtml, + parseNaive, + detectFormat, + getParser, + parseDocument, + DEFAULT_CHUNK_LEVEL, +}; diff --git a/resolver/src/parsers.test.js b/resolver/src/parsers.test.js new file mode 100644 index 0000000..d8db034 --- /dev/null +++ b/resolver/src/parsers.test.js @@ -0,0 +1,887 @@ +const path = require("path"); + +const { + parseMarkdown, + parseMdx, + parseRst, + parseAsciidoc, + parseDitaXml, + parseHtml, + parseNaive, + detectFormat, + getParser, + parseDocument, + DEFAULT_CHUNK_LEVEL, +} = require("./parsers"); + +before(async function () { + const { expect } = await import("chai"); + global.expect = expect; +}); + +describe("Parsers Module", function () { + describe("DEFAULT_CHUNK_LEVEL", function () { + it("should be 2 (H2 level)", function () { + expect(DEFAULT_CHUNK_LEVEL).to.equal(2); + }); + }); + + describe("detectFormat", function () { + it("should detect markdown files", function () { + expect(detectFormat("/docs/guide.md")).to.equal("markdown"); + expect(detectFormat("/docs/guide.markdown")).to.equal("markdown"); + }); + + it("should detect MDX files", function () { + expect(detectFormat("/docs/page.mdx")).to.equal("mdx"); + }); + + it("should detect reStructuredText files", function () { + expect(detectFormat("/docs/index.rst")).to.equal("rst"); + expect(detectFormat("/docs/index.rest")).to.equal("rst"); + }); + + it("should detect AsciiDoc files", function () { + expect(detectFormat("/docs/guide.adoc")).to.equal("asciidoc"); + expect(detectFormat("/docs/guide.asciidoc")).to.equal("asciidoc"); + expect(detectFormat("/docs/guide.asc")).to.equal("asciidoc"); + }); + + it("should detect DITA files", function () { + expect(detectFormat("/docs/topic.dita")).to.equal("dita"); + expect(detectFormat("/docs/map.ditamap")).to.equal("dita"); + }); + + it("should detect XML files", function () { + expect(detectFormat("/docs/config.xml")).to.equal("xml"); + }); + + it("should detect HTML files", function () { + expect(detectFormat("/docs/page.html")).to.equal("html"); + expect(detectFormat("/docs/page.htm")).to.equal("html"); + expect(detectFormat("/docs/page.xhtml")).to.equal("html"); + }); + + it("should return unknown for unrecognized extensions", function () { + expect(detectFormat("/docs/file.txt")).to.equal("unknown"); + expect(detectFormat("/docs/file.json")).to.equal("unknown"); + expect(detectFormat("/docs/file")).to.equal("unknown"); + }); + + it("should handle case-insensitive extensions", function () { + expect(detectFormat("/docs/file.MD")).to.equal("markdown"); + expect(detectFormat("/docs/file.HTML")).to.equal("html"); + }); + }); + + describe("getParser", function () { + it("should return parseMarkdown for markdown format", function () { + expect(getParser("markdown")).to.equal(parseMarkdown); + }); + + it("should return parseMdx for mdx format", function () { + expect(getParser("mdx")).to.equal(parseMdx); + }); + + it("should return parseRst for rst format", function () { + expect(getParser("rst")).to.equal(parseRst); + }); + + it("should return parseAsciidoc for asciidoc format", function () { + expect(getParser("asciidoc")).to.equal(parseAsciidoc); + }); + + it("should return parseDitaXml for dita format", function () { + expect(getParser("dita")).to.equal(parseDitaXml); + }); + + it("should return parseDitaXml for xml format", function () { + expect(getParser("xml")).to.equal(parseDitaXml); + }); + + it("should return parseHtml for html format", function () { + expect(getParser("html")).to.equal(parseHtml); + }); + + it("should return parseNaive for unknown format", function () { + expect(getParser("unknown")).to.equal(parseNaive); + }); + + it("should return parseNaive for undefined format", function () { + expect(getParser(undefined)).to.equal(parseNaive); + }); + }); + + describe("parseMarkdown", function () { + it("should parse simple markdown with H2 sections", async function () { + const content = `# Main Title + +Introduction paragraph. + +## Section One + +Content for section one. + +## Section Two + +Content for section two.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should include heading in chunk", async function () { + const content = `## Getting Started + +Follow these steps to get started.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].heading).to.equal("Getting Started"); + expect(chunks[0].content).to.include("Follow these steps"); + }); + + it("should include source location information", async function () { + const content = `## First Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + expect(chunks[0].sourceLocation.startLine).to.be.a("number"); + expect(chunks[0].sourceLocation.endLine).to.be.a("number"); + expect(chunks[0].sourceLocation.startOffset).to.be.a("number"); + expect(chunks[0].sourceLocation.endOffset).to.be.a("number"); + }); + + it("should handle content before first heading", async function () { + const content = `Some intro text before any heading. + +## First Section + +Section content.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + // Should have at least 2 chunks - intro and section + expect(chunks.length).to.be.at.least(1); + }); + + it("should respect custom chunkLevel option", async function () { + const content = `# H1 Title + +## H2 Section + +### H3 Subsection + +Content in H3. + +### Another H3 + +More content.`; + + // Chunk at H3 level + const chunks = await parseMarkdown(content, { chunkLevel: 3 }); + + // Should create chunks at H3 boundaries too + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should return whole document when no headings present", async function () { + const content = `This is a document without any headings. + +Just paragraphs of text. + +And more text.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].content).to.equal(content); + expect(chunks[0].heading).to.be.null; + }); + + it("should handle empty content", async function () { + const chunks = await parseMarkdown(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle whitespace-only content", async function () { + const chunks = await parseMarkdown(" \n\n "); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle code blocks correctly", async function () { + const content = `## Code Example + +Here is some code: + +\`\`\`javascript +function hello() { + console.log("Hello"); +} +\`\`\` + +More content after code.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + // Content should be in chunks (may include code block in section) + expect(chunks.length).to.be.at.least(1); + // Find the chunk with the code example + const codeChunk = chunks.find(c => c.content.includes("```javascript")); + expect(codeChunk).to.exist; + }); + + it("should handle links and inline formatting", async function () { + const content = `## Links Section + +Check out [Example](https://example.com) for more info. + +**Bold text** and *italic text* are supported.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0].content).to.include("[Example](https://example.com)"); + expect(chunks[0].content).to.include("**Bold text**"); + }); + }); + + describe("parseMdx", function () { + it("should parse MDX content with JSX components", async function () { + const content = `## Component Example + + + +Regular markdown text.`; + + const chunks = await parseMdx(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].content).to.include("Click`; + + const chunks = await parseMdx(content); + + expect(chunks).to.be.an("array"); + // Should handle the import statement + }); + + it("should include source location", async function () { + const content = `## MDX Section + +Some content.`; + + const chunks = await parseMdx(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + expect(chunks[0].sourceLocation.startLine).to.be.a("number"); + }); + + it("should handle empty MDX content", async function () { + const chunks = await parseMdx(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + }); + + describe("parseAsciidoc", function () { + it("should parse AsciiDoc with section headings", async function () { + const content = `= Main Title + +Introduction. + +== First Section + +Content for first section. + +== Second Section + +Content for second section.`; + + const chunks = await parseAsciidoc(content); + + expect(chunks).to.be.an("array"); + // Should find sections + }); + + it("should return whole document when no sections", async function () { + const content = `= Document Title + +Just a document with a title but no sections. + +Some paragraphs here.`; + + const chunks = await parseAsciidoc(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(1); + }); + + it("should include source location", async function () { + const content = `= Title + +== Section + +Content here.`; + + const chunks = await parseAsciidoc(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + }); + + it("should handle empty content", async function () { + const chunks = await parseAsciidoc(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + }); + + describe("parseDitaXml", function () { + it("should parse DITA topic content", async function () { + const content = ` + + + Sample Topic + +
+ First Section +

Section content here.

+
+ +
`; + + const chunks = await parseDitaXml(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(1); + }); + + it("should extract text from sections", async function () { + const content = ` + Topic Title + +
+ Section Title +

Paragraph text.

+
+ +
`; + + const chunks = await parseDitaXml(content); + + expect(chunks).to.be.an("array"); + // Should extract section content + }); + + it("should handle task elements", async function () { + const content = ` + Task Title + + + Do something. + + +`; + + const chunks = await parseDitaXml(content); + + expect(chunks).to.be.an("array"); + }); + + it("should include source location", async function () { + const content = `Test`; + + const chunks = await parseDitaXml(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + }); + + it("should handle empty content", async function () { + const chunks = await parseDitaXml(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle malformed XML gracefully", async function () { + const content = ` + +Test Page + +

Main Title

+

Introduction.

+

First Section

+

First section content.

+

Second Section

+

Second section content.

+ +`; + + const chunks = await parseHtml(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should extract headings as chunk titles", async function () { + const content = `

Getting Started

+

Follow these steps.

`; + + const chunks = await parseHtml(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].heading).to.equal("Getting Started"); + }); + + it("should handle semantic section elements", async function () { + const content = `
+

Section One

+

Content one.

+
+
+

Section Two

+

Content two.

+
`; + + const chunks = await parseHtml(content); + + expect(chunks).to.be.an("array"); + }); + + it("should include source location", async function () { + const content = `

Test

Content

`; + + const chunks = await parseHtml(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + }); + + it("should handle empty HTML", async function () { + const chunks = await parseHtml(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle HTML without headings", async function () { + const content = `

Just some paragraphs.

More text.

`; + + const chunks = await parseHtml(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + }); + + it("should respect chunkLevel option", async function () { + const content = `

H1 Title

+

Content under H1.

+

H2 Section

+

Content under H2.

+

H3 Subsection

+

Content under H3.

`; + + const chunks = await parseHtml(content, { chunkLevel: 3 }); + + expect(chunks).to.be.an("array"); + // Should include H3 as section boundary + }); + }); + + describe("parseNaive", function () { + it("should parse markdown-style headings", async function () { + const content = `# Main Title + +Introduction. + +## Section One + +Content one. + +## Section Two + +Content two.`; + + const chunks = await parseNaive(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should parse AsciiDoc-style headings", async function () { + const content = `= Main Title + +Introduction. + +== Section One + +Content one.`; + + const chunks = await parseNaive(content); + + expect(chunks).to.be.an("array"); + }); + + it("should parse rST-style headings with underlines", async function () { + const content = `Main Title +========== + +Introduction text. + +Section One +----------- + +Content for section one.`; + + const chunks = await parseNaive(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should include source location", async function () { + const content = `## Test Section + +Content here.`; + + const chunks = await parseNaive(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + expect(chunks[0].sourceLocation.startLine).to.be.a("number"); + expect(chunks[0].sourceLocation.endLine).to.be.a("number"); + }); + + it("should return whole document when no headings found", async function () { + const content = `Just plain text. + +More paragraphs. + +No headings here.`; + + const chunks = await parseNaive(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].content).to.equal(content); + }); + + it("should handle empty content", async function () { + const chunks = await parseNaive(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should respect chunkLevel option", async function () { + const content = `# H1 + +## H2 + +### H3 + +Content.`; + + const chunks = await parseNaive(content, { chunkLevel: 3 }); + + expect(chunks).to.be.an("array"); + // Should recognize H3 as section boundary + }); + }); + + describe("parseRst", function () { + // Note: parseRst requires tree-sitter-rst WASM which may not be available in all environments + // These tests will gracefully fall back to naive parsing if WASM isn't loaded + + it("should parse rST content", async function () { + const content = `Title +===== + +Introduction. + +Section One +----------- + +Content one. + +Section Two +----------- + +Content two.`; + + const chunks = await parseRst(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(1); + }); + + it("should include source location", async function () { + const content = `Test +==== + +Content here.`; + + const chunks = await parseRst(content); + + expect(chunks[0].sourceLocation).to.be.an("object"); + }); + + it("should handle empty content", async function () { + const chunks = await parseRst(""); + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(0); + }); + + it("should handle content without sections", async function () { + const content = `Just some plain text without any sections. + +Another paragraph.`; + + const chunks = await parseRst(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + }); + }); + + describe("parseDocument", function () { + it("should use parseMarkdown for .md files", async function () { + const content = `## Section + +Content.`; + + const chunks = await parseDocument(content, "/docs/guide.md"); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(1); + expect(chunks[0].heading).to.equal("Section"); + }); + + it("should use parseMdx for .mdx files", async function () { + const content = `## Section + +`; + + const chunks = await parseDocument(content, "/docs/page.mdx"); + + expect(chunks).to.be.an("array"); + }); + + it("should use parseHtml for .html files", async function () { + const content = `

Section

Content

`; + + const chunks = await parseDocument(content, "/docs/page.html"); + + expect(chunks).to.be.an("array"); + }); + + it("should use parseAsciidoc for .adoc files", async function () { + const content = `= Title + +== Section + +Content.`; + + const chunks = await parseDocument(content, "/docs/guide.adoc"); + + expect(chunks).to.be.an("array"); + }); + + it("should use parseDitaXml for .dita files", async function () { + const content = `Test`; + + const chunks = await parseDocument(content, "/docs/topic.dita"); + + expect(chunks).to.be.an("array"); + }); + + it("should use parseNaive for unknown extensions", async function () { + const content = `## Section + +Content.`; + + const chunks = await parseDocument(content, "/docs/file.txt"); + + expect(chunks).to.be.an("array"); + }); + + it("should pass options to the parser", async function () { + const content = `# H1 + +## H2 + +### H3 + +Content.`; + + const chunks = await parseDocument(content, "/docs/guide.md", { + chunkLevel: 3, + }); + + expect(chunks).to.be.an("array"); + }); + }); + + describe("Chunk structure validation", function () { + it("should always include content property", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0]).to.have.property("content"); + expect(chunks[0].content).to.be.a("string"); + expect(chunks[0].content.length).to.be.greaterThan(0); + }); + + it("should always include sourceLocation property", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0]).to.have.property("sourceLocation"); + expect(chunks[0].sourceLocation).to.have.property("startLine"); + expect(chunks[0].sourceLocation).to.have.property("endLine"); + expect(chunks[0].sourceLocation).to.have.property("startColumn"); + expect(chunks[0].sourceLocation).to.have.property("endColumn"); + expect(chunks[0].sourceLocation).to.have.property("startOffset"); + expect(chunks[0].sourceLocation).to.have.property("endOffset"); + }); + + it("should include heading property (can be null)", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0]).to.have.property("heading"); + }); + + it("should have valid line numbers (1-based)", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0].sourceLocation.startLine).to.be.at.least(1); + expect(chunks[0].sourceLocation.endLine).to.be.at.least( + chunks[0].sourceLocation.startLine + ); + }); + + it("should have valid offsets (0-based)", async function () { + const content = `## Section + +Some content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks[0].sourceLocation.startOffset).to.be.at.least(0); + expect(chunks[0].sourceLocation.endOffset).to.be.greaterThan( + chunks[0].sourceLocation.startOffset + ); + }); + }); + + describe("Edge cases", function () { + it("should handle very long documents", async function () { + const sections = []; + for (let i = 0; i < 100; i++) { + sections.push(`## Section ${i}\n\nContent for section ${i}.`); + } + const content = sections.join("\n\n"); + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(100); + }); + + it("should handle special characters in headings", async function () { + const content = `## Section with "quotes" & chars + +Content here.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks[0].heading).to.include("quotes"); + }); + + it("should handle Unicode content", async function () { + const content = `## 日本語の見出し + +日本語のコンテンツ。 + +## Émojis 🎉 + +Content with émojis 👍`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.equal(2); + expect(chunks[0].heading).to.equal("日本語の見出し"); + }); + + it("should handle mixed line endings", async function () { + const content = "## Section One\r\n\r\nContent.\r\n\n## Section Two\n\nMore content."; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + expect(chunks.length).to.be.at.least(2); + }); + + it("should handle deeply nested headings", async function () { + const content = `# H1 + +## H2 + +### H3 + +#### H4 + +##### H5 + +###### H6 + +Content at deepest level.`; + + const chunks = await parseMarkdown(content); + + expect(chunks).to.be.an("array"); + }); + }); +}); From 0568f32b7ec35372a9f684c2ee1afb2efe9df876 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Tue, 13 Jan 2026 19:56:47 -0800 Subject: [PATCH 90/90] Add AI analysis feature to TestBuilder - Implement function to check for AI integrations in environment variables and config files. - Add state management for analysis errors and analyzed specifications. - Create effect to handle document analysis when the phase changes to 'analyzing'. - Introduce UI elements for displaying analysis results and errors. - Update menu options to include document analysis based on AI integration availability. --- cli/samples/kitten-search-analyze.md | 3 + cli/src/cli/builder/TestBuilder.mjs | 247 +++++++++++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 cli/samples/kitten-search-analyze.md diff --git a/cli/samples/kitten-search-analyze.md b/cli/samples/kitten-search-analyze.md new file mode 100644 index 0000000..71fca97 --- /dev/null +++ b/cli/samples/kitten-search-analyze.md @@ -0,0 +1,3 @@ +Head to DuckDuckGo and search for "American Shorthair kittens". After you hit Enter, wait for the results to load. + +!["Search results for kittens"](search-results.png){ .screenshot } \ No newline at end of file diff --git a/cli/src/cli/builder/TestBuilder.mjs b/cli/src/cli/builder/TestBuilder.mjs index 63a4f40..3efad24 100644 --- a/cli/src/cli/builder/TestBuilder.mjs +++ b/cli/src/cli/builder/TestBuilder.mjs @@ -11,6 +11,7 @@ import * as path from 'path'; import { createRequire } from 'module'; const require = createRequire(import.meta.url); const yaml = require('js-yaml'); +const { analyzeDocument } = require('doc-detective-resolver'); import { createDefaultSpec, createDefaultTest, @@ -35,6 +36,46 @@ const { hasAutoDetectedSteps, } = require('./sourceFileUtils.js'); +/** + * Check if AI integrations are available via environment variables or config file. + * @returns {boolean} True if at least one AI integration is configured + */ +const hasAiIntegration = () => { + // Check environment variables + if (process.env.ANTHROPIC_API_KEY) return true; + if (process.env.OPENAI_API_KEY) return true; + if (process.env.GOOGLE_GENERATIVE_AI_API_KEY) return true; + + // Try to load config file and check for integrations + const configPaths = [ + path.resolve(process.cwd(), '.doc-detective.json'), + path.resolve(process.cwd(), '.doc-detective.yaml'), + path.resolve(process.cwd(), '.doc-detective.yml'), + ]; + + for (const configPath of configPaths) { + if (fs.existsSync(configPath)) { + try { + const content = fs.readFileSync(configPath, 'utf-8'); + const ext = path.extname(configPath).toLowerCase(); + const config = ext === '.json' ? JSON.parse(content) : yaml.load(content); + + if (config?.integrations) { + const { anthropic, openAi, google, ollama } = config.integrations; + if (anthropic?.apiKey) return true; + if (openAi?.apiKey) return true; + if (google?.apiKey) return true; + if (ollama?.baseUrl || ollama) return true; // Ollama doesn't need API key + } + } catch { + // Ignore config parsing errors + } + } + } + + return false; +}; + /** * Determine the output file path based on input file and extension * @param {string|null} inputFilePath - Original input file path @@ -166,6 +207,10 @@ const TestBuilder = ({ const [changedSourceFiles, setChangedSourceFiles] = useState([]); const [inlineUpdateError, setInlineUpdateError] = useState(null); + // State for analyze feature + const [analyzeError, setAnalyzeError] = useState(null); + const [analyzedSpec, setAnalyzedSpec] = useState(null); + // Track original spec for detecting which steps were modified const [originalSpec] = useState(() => initialSpec ? JSON.parse(JSON.stringify(initialSpec)) : null); @@ -185,6 +230,19 @@ const TestBuilder = ({ // Check if spec has auto-detected steps const hasAutoDetected = useMemo(() => hasAutoDetectedSteps(spec), [spec]); + // Check if AI integrations are available + const hasAiConfig = useMemo(() => hasAiIntegration(), []); + + // Check if spec has a source file that can be analyzed + const hasSourceFile = useMemo(() => { + return !!(inputFilePath || spec.contentPath || spec.sourcePath); + }, [inputFilePath, spec]); + + // Get the source file path for analysis + const sourceFilePath = useMemo(() => { + return inputFilePath || spec.contentPath || spec.sourcePath || null; + }, [inputFilePath, spec]); + // Get spec fields const { fields: specFields } = useMemo(() => getSpecFields(), []); @@ -296,6 +354,53 @@ const TestBuilder = ({ }; }, [phase, spec, originalSpec, sourceFileHashes]); + // Effect to handle AI analysis when phase changes to 'analyzing' + useEffect(() => { + if (phase !== 'analyzing') return; + + let cancelled = false; + + const performAnalysis = async () => { + try { + if (!sourceFilePath) { + throw new Error('No source file found. The spec must have an input file or contentPath to analyze.'); + } + + // Check if file exists and read content + if (!fs.existsSync(sourceFilePath)) { + throw new Error(`Source file not found: ${sourceFilePath}`); + } + + const content = fs.readFileSync(sourceFilePath, 'utf-8'); + + if (!content || content.trim().length === 0) { + throw new Error('Source file is empty.'); + } + + // Call analyzeDocument with the content + const result = await analyzeDocument({ + content, + filePath: sourceFilePath, + }); + + if (cancelled) return; + + setAnalyzedSpec(result); + setPhase('analyzePreview'); + } catch (error) { + if (cancelled) return; + setAnalyzeError(error.message); + setPhase('analyzeError'); + } + }; + + performAnalysis(); + + return () => { + cancelled = true; + }; + }, [phase, sourceFilePath]); + // Show validation warning for invalid loaded specs if (showValidationWarning) { return React.createElement( @@ -855,6 +960,133 @@ const TestBuilder = ({ ); } + // Analyzing view - show loading state during AI analysis + if (phase === 'analyzing') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName || path.basename(inputFilePath || 'Spec'), 'Analyze'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'cyan' }, '✨ Analyzing Documentation...') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'gray' }, 'Using AI to generate test specifications based on the source documentation.') + ), + React.createElement( + Text, + { color: 'yellow' }, + '⏳ This may take a moment...' + ) + ); + } + + // Analyze error view + if (phase === 'analyzeError') { + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName || path.basename(inputFilePath || 'Spec'), 'Analyze Error'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'red' }, '❌ Analysis Failed') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { color: 'red' }, analyzeError) + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + { color: 'gray' }, + 'Make sure you have configured an AI integration (Anthropic, OpenAI, Google, or Ollama) in your Doc Detective config or via environment variables.' + ) + ), + React.createElement(SelectInput, { + items: [{ label: '← Back to menu', value: 'back' }], + onSelect: () => { + setAnalyzeError(null); + setPhase('menu'); + }, + }) + ); + } + + // Analyze preview view - show the generated spec and allow user to apply or discard + if (phase === 'analyzePreview') { + const newTestsCount = analyzedSpec?.tests?.length || 0; + const currentTestsCount = spec.tests?.length || 0; + + return React.createElement( + Box, + { flexDirection: 'column', padding: 1 }, + React.createElement(StatusBar, { + location: [specName || path.basename(inputFilePath || 'Spec'), 'Analyze Results'], + }), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement(Text, { bold: true, color: 'green' }, '✨ Analysis Complete!') + ), + React.createElement( + Box, + { marginBottom: 1 }, + React.createElement( + Text, + null, + `Generated ${newTestsCount} test(s) (current spec has ${currentTestsCount} test(s))` + ) + ), + React.createElement(JsonPreview, { + data: analyzedSpec, + title: 'Generated Specification', + }), + React.createElement( + Box, + { marginTop: 1 }, + React.createElement(SelectInput, { + items: [ + { label: '✅ Replace tests with generated tests', value: 'replace' }, + { label: '🔀 Merge (keep existing + add new tests)', value: 'merge' }, + { label: '← Discard and go back', value: 'discard' }, + ], + onSelect: (item) => { + if (item.value === 'replace') { + // Replace tests with analyzed version + setSpec({ ...spec, tests: analyzedSpec?.tests || [] }); + setAnalyzedSpec(null); + setPhase('menu'); + } else if (item.value === 'merge') { + // Merge tests: keep existing tests and add new ones + const mergedTests = [ + ...(spec.tests || []), + ...(analyzedSpec?.tests || []), + ]; + setSpec({ ...spec, tests: mergedTests }); + setAnalyzedSpec(null); + setPhase('menu'); + } else { + // Discard + setAnalyzedSpec(null); + setPhase('menu'); + } + }, + }) + ) + ); + } + // Save confirmation if (phase === 'save') { const isOverwrite = inputFilePath && (inputFileExtension === '.json' || inputFileExtension === '.yaml' || inputFileExtension === '.yml'); @@ -1027,6 +1259,18 @@ const TestBuilder = ({ // Actions menuItems.push({ label: '🔍 Preview', value: 'preview' }); + // Analyze option - show if spec has a source file + if (hasSourceFile) { + if (hasAiConfig) { + menuItems.push({ label: '✨ Analyze document', value: 'analyze' }); + } else { + menuItems.push({ + label: '✨ Analyze document (requires AI integration)', + value: `none_${menuIndex++}` + }); + } + } + if (validation.valid && tests.length > 0) { // Use different label based on whether spec has inline sources let saveLabel; @@ -1135,6 +1379,9 @@ const TestBuilder = ({ case 'preview': setPhase('preview'); break; + case 'analyze': + setPhase('analyzing'); + break; case 'save': // Use preSave to check for inline sources before saving setPhase('preSave');