From 8413929b8b4bcb92381b071596b3f8014b7fc6a8 Mon Sep 17 00:00:00 2001 From: Peter Smith Date: Mon, 13 Jul 2026 06:15:45 +1200 Subject: [PATCH 1/7] docs: propose add-webdriverio-e2e-testing OpenSpec change Adds proposal, design, spec, and tasks artifacts for DEVX-987 (WebdriverIO + wdio-vscode-service e2e test framework, wired small-app demonstration fixture across S3/Lambda/IAM/SQS/SNS, and CI job). Co-Authored-By: Claude Sonnet 5 --- .../.openspec.yaml | 2 + .../add-webdriverio-e2e-testing/design.md | 93 +++++++++++++++++++ .../add-webdriverio-e2e-testing/proposal.md | 29 ++++++ .../specs/e2e-testing/spec.md | 86 +++++++++++++++++ .../add-webdriverio-e2e-testing/tasks.md | 55 +++++++++++ 5 files changed, 265 insertions(+) create mode 100644 openspec/changes/add-webdriverio-e2e-testing/.openspec.yaml create mode 100644 openspec/changes/add-webdriverio-e2e-testing/design.md create mode 100644 openspec/changes/add-webdriverio-e2e-testing/proposal.md create mode 100644 openspec/changes/add-webdriverio-e2e-testing/specs/e2e-testing/spec.md create mode 100644 openspec/changes/add-webdriverio-e2e-testing/tasks.md diff --git a/openspec/changes/add-webdriverio-e2e-testing/.openspec.yaml b/openspec/changes/add-webdriverio-e2e-testing/.openspec.yaml new file mode 100644 index 0000000..8803b47 --- /dev/null +++ b/openspec/changes/add-webdriverio-e2e-testing/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-07-12 diff --git a/openspec/changes/add-webdriverio-e2e-testing/design.md b/openspec/changes/add-webdriverio-e2e-testing/design.md new file mode 100644 index 0000000..d0864ba --- /dev/null +++ b/openspec/changes/add-webdriverio-e2e-testing/design.md @@ -0,0 +1,93 @@ +## Context + +The extension already has one automated test layer: `pnpm test` (`vscode-test` / `@vscode/test-cli`, configured in `.vscode-test.mjs`), which loads `out/test/**/*.test.js` and drives the `vscode` extension API in-process. That layer cannot observe or interact with anything actually rendered — the Resources tree view, the Resource Details webview, Quick Picks. DEVX-987 (parent: DEVX-970, project "App Inspector: Automated UI Testing") asks for the framework that can, so that a large backlog of real UI-level scenarios (see `openspec/specs/resource-browser/spec.md`) can be automated afterward. This change adds only the framework plus one demonstration suite; the backlog itself is out of scope, left for whoever picks up the next slice. + +## Goals / Non-Goals + +**Goals:** +- A `pnpm test:e2e` target that launches a real Extension Development Host under WebdriverIO (`wdio-vscode-service`) and drives it through `browser`/`$`/`$$` like a user would. +- A repeatable pattern for standing up real LocalStack state for a suite: shell out to the `lstk` CLI directly (`start`/`stop`/`tf init`/`tf apply`/`tf destroy`), never through the extension's own "Start LocalStack" command. +- One demonstration suite covering the full stack end-to-end: deploy a small wired application (S3, Lambda, IAM, SQS, SNS) via Terraform, confirm the Resources tree shows exactly those resources (nothing missing, nothing stray), and confirm Resource Details shows the correct field set/values for each, including up to three explicitly-set non-default field values per resource. +- CI wired so this suite runs on every PR, alongside (not replacing) the existing `vscode-test` job. + +**Non-Goals:** +- Implementing the broader backlog of UI-level scenarios described in `openspec/specs/resource-browser/spec.md` (profiles/regions selectors, Views, stack-focus, per-resource-type coverage, opt-in gating). Those are follow-up work. +- Building any tree-structure handling for a dedicated "global"/region-less service concept. IAM is deliberately asserted against its current, incidental placement (see Decisions) — a real global-region concept is expected to land as separate future work. +- Replacing or modifying the existing `vscode-test` suite/job — the two suites are complementary and both keep running. +- Cross-browser or multi-OS WebDriver support — `capabilities` only configures `browserName: "vscode"`. + +## Decisions + +**WebdriverIO + `wdio-vscode-service`, not `@vscode/test-electron`'s own UI automation or Playwright.** `wdio-vscode-service` is purpose-built to boot a real VS Code Extension Development Host and exposes VS Code-shaped page objects (`Workbench`, `CustomTreeSection`, `TreeItem`, `WebView`) rather than raw DOM selectors for everything, which is exactly the abstraction level the Resources-tree/Resource-Details scenarios need. This is what the Linear issue specifies directly. + +**Suite lives under `test/e2e/`, fully separate from `src/test/` (the existing in-process suite) and its own `wdio.conf.ts` at repo root.** Keeps `pretest` (`vscode-test`'s `compile`) and `pretest:e2e` independent, and keeps the two frameworks' very different runtime models (in-process API vs. real WebDriver session) from bleeding into one config or one `tsconfig`. + +**`test/e2e` gets its own `tsconfig.json` (extending the root one) and is excluded from the root `tsconfig.json`'s `include`.** The webdriverio/`wdio-vscode-service` type surface (async globals, `wdio-vscode-service`'s own `.d.ts`) doesn't belong in the extension's own type-check (`pnpm tsc` / CI's `Type Check` job), and some of webdriverio's own `.d.ts` internals don't resolve cleanly under pnpm's non-flat `node_modules` layout (hence `skipLibCheck: true` scoped to that project only, not the whole repo). ESLint needs the same split: a dedicated `files: ["test/e2e/**/*.ts", "wdio.conf.ts"]` override pointing `parserOptions.project` at `test/e2e/tsconfig.json`, since the root config's `projectService` never covers files the root tsconfig excludes. + +**Shell out to `lstk` directly for lifecycle, never `localstack.start`/`localstack.stop` commands.** The extension's own `startLocalStack()` (`src/utils/manage.ts`) spawns `lstk start --no-banner --detached` targeting an older CLI shape and isn't reliable against the current `lstk` binary. `lstk start` (invoked directly, not through the extension) blocks until the emulator is ready and needs no AWS profile — the Resources view's default LocalStack account is populated from the emulator's own metamodel endpoint (`computeMetamodelFocus`/`computeDefaultView` in `src/platforms/aws/models/metamodelFocus.ts`), not AWS credentials. `lstk tf` (alias for `lstk terraform`) is a `tflocal`-style wrapper: plain `aws`-provider Terraform files run unmodified against the emulator, no endpoint overrides needed in the fixture, and resources are already present in the emulator by the time `lstk tf apply` returns. + +**Fixture-per-suite Terraform under `test/e2e/fixtures/terraform/`, applied/destroyed in `suiteSetup`/`suiteTeardown`.** Mirrors how a real user would deploy, and keeps the demonstration suite's teardown resilient (`.catch(() => undefined)` on both `terraformDestroy()` and `stop()`) so a failed assertion doesn't leave the emulator running or the fixture's state dangling for the next CI run. + +**Poll/retry instead of fixed waits for tree and webview readiness.** VS Code's own tree refresh and the webview's `postMessage` round-trip aren't synchronously observable from WebDriver, so a `waitForResourcesTree` helper uses a bounded retry loop (clicking `Refresh Resources`, backing off 3s→6s between attempts) rather than a fixed sleep, and a `waitForDetailsTable` helper uses `browser.waitUntil` polling for populated `table tr` rows. This avoids both flakiness (fixed short waits) and slow suites (fixed long waits). The demonstration suite closes each webview (`webview.close()`) right after reading it, matching the currently-selected webview via `browser.getWorkbench().getAllWebviews()[0]` rather than by title — the Resource Details webview's HTML has no ``, and since the suite only ever has one webview open at a time, matching by position is sufficient. + +**Mocha `ui: "tdd"`, matching `src/test/**`'s existing style**, so `suite`/`test`/`suiteSetup`/`suiteTeardown` read the same across both suite types. Test timeout set generously (5 minutes) because the suite shells out to `lstk start` and `lstk tf apply`, both real wall-clock operations against a real emulator, not mocks. + +**New CI job, not a replacement of the existing `Test` job in `build.yml`.** Add a `test-e2e` job alongside `format`/`lint`/`type-check`/`test`, running `xvfb-run -a pnpm test:e2e` (matching the existing job's `xvfb-run` pattern for `vscode-test`, since both need a virtual display in headless CI). Needs `lstk` (and Docker, for the emulator itself) available on the runner — see Open Questions. + +**`LOCALSTACK_AUTH_TOKEN` is required and comes from a repository secret, scoped only to the `test-e2e` job.** Despite S3/Lambda/IAM/SQS/SNS all being LocalStack Community (free-tier) *services*, the `lstk` CLI itself requires an authenticated session — a distinct requirement from which AWS services the fixture happens to use. The token is supplied as a plain job-level `env: LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }}`; no extra wiring is needed beyond that, since `lstk start` already forwards any `LOCALSTACK_`-prefixed host environment variable into the emulator. The secret is added directly to the GitHub repository outside this change (an admin action, not something this change's tasks perform). Following this repo's existing naming convention (`LOCALSTACK_BOT_TOKEN`, `VSCE_PAT`, `OVSX_PAT` in other workflows), `LOCALSTACK_AUTH_TOKEN` fits alongside them. + +**The `test-e2e` job is guarded to skip (not fail) on pull requests from forks.** `localstack/localstack-toolkit-vscode` is a public repository, and GitHub does not expose repository secrets to `pull_request`-triggered runs whose head is a fork — a boundary this repo has never previously had to design around, since every existing secret-consuming workflow either uses `pull_request_target` (`dependabot-auto-merge.yml`, deliberately, for Dependabot PRs only) or triggers on `push`/`schedule` (`release.yml`, `release-auto-merge.yml`), and the one existing plain-`pull_request` workflow (`pull-request-lint.yml`) never touches secrets. Without a guard, `test-e2e` would resolve an empty token and fail `lstk start` on every external contributor's PR — a persistent, confusing red check they can't fix themselves. The job instead carries: +```yaml +if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository +``` +so it runs normally for same-repo branches/pushes and is skipped (shown grey, not red) for fork PRs — those PRs still get `format`/`lint`/`type-check`/`test`, just not e2e coverage until a maintainer pushes the branch into the main repo or merges it. The `event_name != 'pull_request'` half keeps the guard from misfiring on non-PR triggers (e.g. a direct push), where `github.event.pull_request` doesn't exist at all. + +**Trust-policy pins in `pnpm-workspace.yaml` for wdio's transitive deps, not blanket `--frozen-lockfile` bypass.** `@wdio/repl@9.4.4` and `pino@9.14.0` trip pnpm's no-downgrade trust check on install. Both are legitimate: `@wdio/repl@9.4.4` keeps the same signing key as `8.40.3` (the last release with full npm provenance/SLSA attestation) — the regression is missing attestation metadata, not a takeover, consistent with the whole wdio v9 line changing its publish pipeline — while the later `9.16.2` (a different signing key entirely) stays blocked, hence pinning the override to `9.4.4`. `pino@9.14.0` is signed with npm's current registry key (active since the prior key expired 2025-01-29), the same registry-wide key rotation, not anything specific to `pino`. `edgedriver`/`geckodriver` are set to `allowBuilds: false` since only `browserName: "vscode"` is configured and there's no reason to let those packages' postinstall scripts fetch Edge/Firefox WebDriver binaries. + +**Fixture models a real wired small application, not five independent resources.** The Linear issue asks for "a small application," and Lambda's second tracked resource type (`event-source-mapping`, `lambda.ts:103-169`) gives a natural, real wiring point rather than an artificial one: + +``` +SNS Topic ("wdio-e2e-test-topic") + │ subscription (protocol: sqs) + ▼ +SQS Queue ("wdio-e2e-test-queue") ──event source mapping──▶ Lambda Function ("wdio-e2e-test-function") + │ role + ▼ + IAM Role ("wdio-e2e-test-function-role") + +S3 Bucket ("wdio-e2e-test-bucket") ── referenced via the function's BUCKET_NAME + environment variable (narrative wiring only; + Lambda's `detail` list doesn't expose env vars, + so this isn't itself an assertion target) +``` + +The SNS→SQS subscription needs a queue policy (`aws_sqs_queue_policy`) granting `sns.amazonaws.com` permission to send to the queue — ordinary Terraform for this pattern, not LocalStack-specific. IAM→Lambda is not optional wiring, just how `aws_lambda_function.role` works; it's listed here because it's also the mandatory dependency ordering Terraform resolves via resource references. + +**Up to three non-default field values per resource, never fewer than the resource's field set actually supports, never padded to force the count.** Checked directly against each service definition's `detail` list: + +| Resource | Non-default fields used | Count | Why | +|---|---|---|---| +| IAM Role | `Path` (e.g. `/service-role/`), `Description`, `MaxSessionDuration` (e.g. `7200`) | 3 | Exactly three configurable fields exist (`iam.ts:61-86`); use all three. | +| Lambda Function | `Description`, `MemorySize`, `Timeout` | 3 | Eight configurable fields exist (`lambda.ts:60-101`); three chosen for clarity. | +| SQS Queue | `VisibilityTimeout`, `MessageRetentionPeriod`, `DelaySeconds` | 3 | Six configurable fields exist (`sqs.ts`); `VisibilityTimeout` set ≥ the function's `Timeout` (standard SQS/Lambda practice, not just for the field count). | +| SNS Topic | `DisplayName` (explicit) + `SubscriptionsConfirmed` (flips 0→1 once the SQS subscription confirms) | 2 | `Policy`/`EffectiveDeliveryPolicy` are AWS-populated regardless of input — asserting "non-default" there would mean brittle JSON-content checks, not a real configuration choice. | +| S3 Bucket | — | 0 | `detail` list (`s3.ts:34-37`) is only `Name` + `Creation Date`; there is no configurable field beyond the required bucket name to set non-default. | + +**IAM's tree placement is asserted against current, incidental behavior — not a designed "global service" placement.** There is no region-less/"global" concept anywhere in the tree-building code (`Focus`/`ResourceRegionTreeItem`/`declarative/engine.ts` all treat every service identically); IAM's own `iam.ts:12` "global service" comment is descriptive prose the type system never reads. Because the fixture deploys into a single LocalStack region, the metamodel records the IAM role's activity under that one real region key, and `metamodelToFocus` only drops the empty-string `""` mirror key — so the role simply renders under the same region row as everything else, incidentally, not by design. The demonstration suite asserts exactly that shape. If a real "global region" concept is added to the product later, this assertion is expected to need revisiting — this change deliberately does not try to anticipate that design. + +**Lambda's deployment package is generated at `apply` time via the `hashicorp/archive` provider's `archive_file` data source, with the handler source inline (`source { filename, content = <<EOF ... EOF }`) rather than a checked-in file of any kind.** This keeps the entire fixture as plain, diffable HCL — no binary asset in the repo, no separate handler source file to keep in sync with a prebuilt zip, and no risk of a stray `.js`/`.py` fixture file being unintentionally swept into the root `eslint.config.mjs`'s rules (which have no top-level `files` restriction limiting them to TypeScript). `aws_lambda_function.source_code_hash` is set from `archive_file`'s `output_base64sha256` so Terraform correctly detects when the inline handler content changes and redeploys, rather than treating the (constant) output filename as unchanged. `archive` only manipulates local files (no credentials, no network calls beyond the initial provider download from the registry, same category as the `aws` provider already required) — adding it to `required_providers` is the only new cost. The generated `.zip` itself is a build artifact, `.gitignore`'d alongside the other Terraform run artifacts. + +**Tree-walking assertions match tree rows by label *and* description, not label alone.** Lambda registers two resource types (`function`, `event-source-mapping`, `lambda.ts:27-169`), which render as two sibling tree rows both labeled `Lambda` (one described `Functions`, the other `Event Source Mappings`) — the existing `findByLabel`/`.indexOf(label)` pattern (workable when every service+type row had a distinct label) breaks on that duplicate. The demonstration suite's tree-walking helper is updated to resolve rows by `(label, description)` pairs instead. + +## Risks / Trade-offs + +- **[Risk] CI runner needs `lstk`, Docker, and enough resources to run a real LocalStack container** → the existing `test` job already runs on `ubuntu-latest` (Docker preinstalled); add an `lstk` install step (official install script/binary release) to the new job. Flagged as an Open Question below since the exact install mechanism for Linux CI hasn't been verified in this change. (`lstk tf init` also needs to download the `hashicorp/archive` provider alongside `hashicorp/aws` — the same registry-access requirement as today, not a new category of dependency.) +- **[Risk] New job materially increases PR CI wall-clock time** (spinning up a real container + Extension Development Host + WebDriver session, vs. the in-process `vscode-test` job) → acceptable for now since it's one demonstration suite; revisit parallelization/sharding once further e2e suites start landing. +- **[Risk] Flaky tree/webview timing in CI** (slower/more contended than local dev) → mitigated by the bounded-retry `waitForResourcesTree` / `waitUntil`-polling `waitForDetailsTable` helpers rather than fixed sleeps, but CI-specific flakiness can't be fully ruled out until this actually runs in the pipeline a few times. +- **[Trade-off] Terraform fixture state files (`terraform.tfstate*`, `.terraform/`, `.terraform.lock.hcl`) are runtime artifacts, not checked in** → `.gitignore`'d; each CI run starts from a clean fixture. Local runs will accumulate this state between manual `test:e2e` invocations, which is fine (matches ordinary Terraform workflow) but means a developer who force-kills a run mid-suite may need to `lstk tf destroy` by hand before the next one. +- **[Trade-off] SNS is asserted with only two non-default field values, S3 with none** → intentionally short of the "three" mentioned in the Linear issue, because that's genuinely all the extension's current Resource Details view exposes as configurable for those two resource types; padding further would mean asserting on values that aren't real configuration choices. + +## Open Questions + +- Exact `lstk` install step for the `ubuntu-latest` GitHub Actions runner (official install script vs. a pinned release binary vs. an `lstk`-provided GitHub Action) — needs a quick check against `github.com/localstack/lstk`'s release/install docs before writing the workflow step. +- Whether `build.yml` gains a new job or this is a separate workflow file scoped to PRs only (the issue says "a new GitHub Actions workflow") — leaning toward a new job in `build.yml` for consistency with the existing `format`/`lint`/`type-check`/`test` structure, final call left to tasks.md. diff --git a/openspec/changes/add-webdriverio-e2e-testing/proposal.md b/openspec/changes/add-webdriverio-e2e-testing/proposal.md new file mode 100644 index 0000000..8f7e96f --- /dev/null +++ b/openspec/changes/add-webdriverio-e2e-testing/proposal.md @@ -0,0 +1,29 @@ +## Why + +The extension currently has only an in-process `vscode-test` suite (`pnpm test`), which drives the `vscode` API directly and cannot exercise the real rendered UI — tree views, webviews, Quick Picks — as a user actually sees them. Before we can write extensive end-to-end coverage for the Resources view / Resource Details panel (and other UI-facing behavior), we need a framework capable of driving a genuine Extension Development Host through WebDriver. This change adds that framework, wired into CI, with a single demonstration suite proving the whole stack fits together end-to-end. + +## What Changes + +- Add a `test:e2e` pnpm target that runs WebdriverIO (`@wdio/cli`, `@wdio/local-runner`, `@wdio/mocha-framework`) with `wdio-vscode-service` against a real Extension Development Host, configured via a new `wdio.conf.ts`. +- Add `test/e2e/` housing the e2e suite: a `support/lstk.ts` helper that shells out to the `lstk` CLI (`start`/`stop`/`tf init`/`tf apply`/`tf destroy`), a Terraform fixture under `test/e2e/fixtures/terraform/`, an empty workspace fixture the Extension Development Host opens, and a `specs/` directory of `*.e2e.ts` suites. +- Add a demonstration suite (`resource-browser.e2e.ts`) that starts LocalStack, deploys a small wired application via Terraform — an SNS topic fanning out to an SQS queue, which triggers a Lambda function (via an event source mapping) running under a dedicated IAM role, plus an S3 bucket referenced by the function — enables the resource browser opt-in, walks the Resources tree to confirm exactly those resources appear, and opens Resource Details for each to confirm the expected field sets and values. Each resource carries up to three explicitly-set non-default field values (fewer where the resource's Resource Details view doesn't expose that many configurable fields — see design.md). +- Add a new GitHub Actions job (in `.github/workflows/build.yml`, or a new workflow file) that runs `test:e2e` on every pull request, using `xvfb-run` the same way the existing `Test` job does for `vscode-test`. +- Supporting config: exclude `test/` and `wdio.conf.ts` from the root `tsconfig.json`'s type-checked set (with their own `test/e2e/tsconfig.json`), point ESLint's `test/e2e/**/*.ts` + `wdio.conf.ts` files at that tsconfig, ignore e2e run artifacts (`.wdio-vscode-service`, `test/e2e/logs/`, Terraform state/lock/plugin files) in `.gitignore`, and pin/allow the `wdio`-related packages' install-time trust checks in `pnpm-workspace.yaml`. + +This PR delivers only the framework and one demonstration suite, not the full backlog of e2e coverage described in `openspec/specs/resource-browser/spec.md`. + +## Capabilities + +### New Capabilities +- `e2e-testing`: WebdriverIO + `wdio-vscode-service` framework for driving the extension's real rendered UI in a genuine Extension Development Host, plus the `lstk`/Terraform fixture conventions e2e suites use to stand up LocalStack state, and the CI job that runs it on every PR. + +### Modified Capabilities +- None. This introduces a new testing capability; it does not change the requirements of any existing product capability (`resource-browser`, etc.). The demonstration suite verifies existing `resource-browser` behavior but doesn't alter its spec. + +## Impact + +- **New dependencies** (devDependencies): `@wdio/cli`, `@wdio/local-runner`, `@wdio/mocha-framework`, `@wdio/spec-reporter`, `expect-webdriverio`, `wdio-vscode-service`, `webdriverio`, `tsx`. +- **New files**: `wdio.conf.ts`, `test/e2e/**` (support helper, fixtures — including a small prebuilt Lambda deployment package — specs, `tsconfig.json`, `global.d.ts`). +- **Modified files**: `package.json` (scripts + devDependencies), `tsconfig.json` (exclude e2e sources), `eslint.config.mjs` (separate parser project for e2e sources), `.gitignore` (ignore e2e run artifacts), `pnpm-workspace.yaml` (trust/build-script policy for wdio's transitive deps), `.github/workflows/build.yml` (new CI job). +- **CI runtime**: adds a job per PR that shells out to `lstk start`/`lstk tf apply` and drives a real Extension Development Host — meaningfully slower than the existing in-process `vscode-test` job, and requires the `lstk` CLI and Terraform to be available in the CI runner image. +- **No production/runtime code changes** — this is entirely developer tooling and CI. diff --git a/openspec/changes/add-webdriverio-e2e-testing/specs/e2e-testing/spec.md b/openspec/changes/add-webdriverio-e2e-testing/specs/e2e-testing/spec.md new file mode 100644 index 0000000..cf95688 --- /dev/null +++ b/openspec/changes/add-webdriverio-e2e-testing/specs/e2e-testing/spec.md @@ -0,0 +1,86 @@ +## ADDED Requirements + +### Requirement: `test:e2e` pnpm target +The project SHALL provide a `pnpm test:e2e` target that compiles the extension and runs the WebdriverIO test runner against a real VS Code Extension Development Host, independent of the existing `pnpm test` (`vscode-test`) in-process suite. + +#### Scenario: Running the target locally +- **WHEN** a developer runs `pnpm test:e2e` in a checkout with `lstk` and Docker available +- **THEN** the extension is compiled, a WebdriverIO session boots a real Extension Development Host with the extension loaded, every spec under `test/e2e/specs/**/*.e2e.ts` runs, and a spec-style report is printed to the console + +#### Scenario: Existing in-process suite is unaffected +- **WHEN** a developer runs `pnpm test` +- **THEN** it continues to run only the `vscode-test` suite from `out/test/**/*.test.js`, unaffected by the addition of `test:e2e` + +### Requirement: LocalStack and fixture lifecycle via the `lstk` CLI +E2e suites SHALL manage LocalStack and deployed test resources by shelling out to the `lstk` CLI directly (`start`, `stop`, `terraform init`, `terraform apply`, `terraform destroy`), not through the extension's own LocalStack start/stop commands. + +#### Scenario: Suite setup starts LocalStack and deploys fixture resources +- **WHEN** a suite's `suiteSetup` runs +- **THEN** it invokes `lstk start` and waits for it to complete before invoking `lstk tf init` and `lstk tf apply -auto-approve` against that suite's Terraform fixture directory, and a non-zero exit from any of these raises an error including captured stdout/stderr + +#### Scenario: Suite teardown tears down fixture resources and stops LocalStack +- **WHEN** a suite's `suiteTeardown` runs, including after a failed assertion +- **THEN** it invokes `lstk tf destroy -auto-approve` against the suite's fixture directory followed by `lstk stop`, and a failure in either step does not prevent the other from being attempted + +### Requirement: Demonstration suite fixture models a wired small application +A demonstration e2e suite SHALL deploy a single Terraform fixture representing a small wired application across all five resource types named in DEVX-987: an SNS topic, an SQS queue, a Lambda function, an IAM role, and an S3 bucket. The SNS topic SHALL have a subscription delivering to the SQS queue; the SQS queue SHALL trigger the Lambda function via an event source mapping; the Lambda function SHALL run under the IAM role. Each resource SHALL carry as many explicitly-set non-default field values as its Resource Details view exposes as configurable, up to a maximum of three, and never fewer than that maximum supports. + +#### Scenario: Fixture resources are wired, not independent +- **WHEN** the fixture has been applied +- **THEN** the deployed SNS topic has a confirmed subscription delivering to the deployed SQS queue, the deployed SQS queue has an event source mapping targeting the deployed Lambda function, and the deployed Lambda function's role is the deployed IAM role + +### Requirement: Demonstration suite validates Resources tree completeness +The demonstration suite SHALL assert that the Resources tree — after enabling the resource browser opt-in and refreshing — shows exactly the fixture's deployed resources under exactly the expected profile/region/service rows, with no missing or stray entries, including the IAM role's current (region-collapsed) placement. + +#### Scenario: Tree shows exactly the deployed resources +- **WHEN** the fixture has been applied and the Resources view has been refreshed +- **THEN** the tree shows exactly one region (matching the fixture's configured region), exactly the services/resource-types `IAM`/`Roles`, `Lambda`/`Functions`, `Lambda`/`Event Source Mappings`, `S3`/`Buckets`, `SNS`/`Topics`, and `SQS`/`Queues` under it, and exactly the fixture's one resource under each + +#### Scenario: IAM's role is asserted at its current tree placement +- **WHEN** the fixture's IAM role is located in the tree +- **THEN** it appears under the same single region row as every other deployed resource, reflecting the tree-building code's current behavior rather than a dedicated region-less/"global" placement (which does not exist in the tree-building code as of this change) + +### Requirement: Demonstration suite validates Resource Details field sets and values +The demonstration suite SHALL open the Resource Details panel for each deployed resource and assert both the exact set of field names shown and the correctness of field values, including each resource's explicitly-set non-default values. + +#### Scenario: S3 bucket details show correct fields and values +- **WHEN** the deployed S3 bucket is selected in the Resources tree +- **THEN** Resource Details shows exactly the fields `ARN`, `Service`, `Name`, `Creation Date`, with `ARN` and `Name` matching the fixture's bucket, `Service` equal to `S3`, and `Creation Date` a parseable date + +#### Scenario: SQS queue details show correct fields, including explicitly-set values +- **WHEN** the deployed SQS queue is selected in the Resources tree +- **THEN** Resource Details shows exactly the expected SQS field set, with `ARN`/`Name`/`Service` matching the fixture and the queue, and the fixture's explicitly-configured `Visibility Timeout`, `Message Retention Period`, and `Delay Seconds` values shown exactly as configured + +#### Scenario: SNS topic details show correct fields, including explicitly-set and wiring-derived values +- **WHEN** the deployed SNS topic is selected in the Resources tree +- **THEN** Resource Details shows exactly the expected SNS field set, with `Name`/`Service` matching the fixture and the topic, the fixture's explicitly-configured `Display Name` shown exactly as configured, and `Subscriptions Confirmed` equal to `1` reflecting the deployed SQS subscription + +#### Scenario: Lambda function details show correct fields, including explicitly-set values +- **WHEN** the deployed Lambda function is selected in the Resources tree +- **THEN** Resource Details shows exactly the expected Lambda function field set, with `Name`/`Service`/`Role` matching the fixture and the function's IAM role, and the fixture's explicitly-configured `Description`, `Memory Size`, and `Timeout` values shown exactly as configured + +#### Scenario: Lambda event source mapping details show correct fields +- **WHEN** the deployed Lambda event source mapping is selected in the Resources tree +- **THEN** Resource Details shows exactly the expected event source mapping field set, with `Function ARN` matching the deployed Lambda function and `Event Source ARN` matching the deployed SQS queue + +#### Scenario: IAM role details show correct fields, including explicitly-set values +- **WHEN** the deployed IAM role is selected in the Resources tree +- **THEN** Resource Details shows exactly the expected IAM role field set, with `Role Name` matching the fixture, and the fixture's explicitly-configured `Path`, `Description`, and `Max Session Duration` values shown exactly as configured + +### Requirement: E2e suite runs in CI on every pull request +A GitHub Actions job SHALL run `pnpm test:e2e` for every pull request targeting the main branch, in addition to (not replacing) the existing build/format/lint/type-check/test jobs. + +#### Scenario: Pull request triggers the e2e job +- **WHEN** a pull request is opened or updated against the main branch +- **THEN** a CI job runs `pnpm test:e2e` (via a headless-display wrapper, matching the existing `test` job's approach) and the pull request's checks reflect its pass/fail result + +### Requirement: E2e sources are isolated from the extension's own type-check and lint +Files under `test/e2e/` and `wdio.conf.ts` SHALL be excluded from the root TypeScript project (`pnpm tsc` / the `Type Check` CI job) and instead type-check and lint against their own dedicated TypeScript project. + +#### Scenario: Root type-check ignores e2e sources +- **WHEN** `pnpm tsc` runs against the root `tsconfig.json` +- **THEN** it does not attempt to compile or type-check any file under `test/e2e/` or `wdio.conf.ts` + +#### Scenario: E2e sources still lint and type-check under their own project +- **WHEN** `pnpm eslint` runs +- **THEN** files under `test/e2e/**/*.ts` and `wdio.conf.ts` are linted using `test/e2e/tsconfig.json` as their parser project, rather than being skipped or matched against the root project diff --git a/openspec/changes/add-webdriverio-e2e-testing/tasks.md b/openspec/changes/add-webdriverio-e2e-testing/tasks.md new file mode 100644 index 0000000..a6422a3 --- /dev/null +++ b/openspec/changes/add-webdriverio-e2e-testing/tasks.md @@ -0,0 +1,55 @@ +## 1. Dependencies & Workspace Trust Policy + +- [ ] 1.1 Add devDependencies: `@wdio/cli@^9.29.1`, `@wdio/local-runner@^9.29.1`, `@wdio/mocha-framework@^9.29.1`, `@wdio/spec-reporter@^9.29.1`, `expect-webdriverio@^5.7.0`, `wdio-vscode-service@^8.0.0`, `webdriverio@^9.29.1`, `tsx@^4.22.4` (`@types/mocha` is already a devDependency). +- [ ] 1.2 Add `pnpm-workspace.yaml` entries needed for a clean `pnpm install --frozen-lockfile`: a `trustPolicyExclude` entry for `@wdio/repl@9.4.4` (retains the same signing key as `8.40.3`, the last release with full provenance/SLSA attestation — a metadata regression, not a takeover) and for `pino@9.14.0` (signed with npm's current post-rotation registry key), `allowBuilds: false` for `edgedriver`/`geckodriver` (pulled in transitively but unused since `capabilities` only configures `browserName: "vscode"`), and an `overrides` entry pinning `"@wdio/repl": 9.4.4` (the later `9.16.2` uses a different signing key entirely and should stay blocked). +- [ ] 1.3 Run `pnpm install` and confirm it completes without a trust-policy prompt or error. + +## 2. WebdriverIO Configuration + +- [ ] 2.1 Add `wdio.conf.ts` at the repo root: `runner: "local"`, `outputDir: "test/e2e/logs"`, `specs: ["./test/e2e/specs/**/*.e2e.ts"]`, `maxInstances: 1`, `capabilities` with `browserName: "vscode"` / `browserVersion: "stable"` / `wdio:enforceWebDriverClassic: true` / `wdio:vscodeOptions.extensionPath` set to the repo root and `workspacePath` set to `test/e2e/fixtures/workspace`, `services: ["vscode"]`, `framework: "mocha"` with `mochaOpts.ui: "tdd"` and a 5-minute timeout, `reporters: ["spec"]`. +- [ ] 2.2 Add `test/e2e/tsconfig.json` extending the root `tsconfig.json`, with `skipLibCheck: true`, `types` covering `node`/`mocha`/`@wdio/mocha-framework`/`expect-webdriverio`/`wdio-vscode-service`, `include` covering `**/*.ts` and `../../wdio.conf.ts`, and an empty `exclude` override (so it isn't inherited from the root project). +- [ ] 2.3 Add `test/e2e/global.d.ts` with the triple-slash reference into `webdriverio`'s internal async type declarations, to bring `browser`/`$`/`$$` into scope as ambient globals. +- [ ] 2.4 Add `test/e2e/fixtures/workspace/.gitkeep` so the Extension Development Host has a workspace folder to open. + +## 3. Root Config Updates (tsconfig, eslint, gitignore) + +- [ ] 3.1 Add `"exclude": ["node_modules", "out", "test", "wdio.conf.ts"]` to the root `tsconfig.json`. +- [ ] 3.2 Add an ESLint override in `eslint.config.mjs` for `files: ["test/e2e/**/*.ts", "wdio.conf.ts"]` that disables `projectService` and sets `parserOptions.project` to `["./test/e2e/tsconfig.json"]` with `tsconfigRootDir: import.meta.dirname`. +- [ ] 3.3 Add to `.gitignore`: `.wdio-vscode-service`, `/test/e2e/logs/`, `/test/e2e/fixtures/terraform/.terraform/`, `/test/e2e/fixtures/terraform/.terraform.lock.hcl`, `/test/e2e/fixtures/terraform/terraform.tfstate*`, `/test/e2e/fixtures/terraform/*.zip` (the `archive_file`-generated Lambda package). + +## 4. `lstk`/Terraform Support Helper & Fixture + +- [ ] 4.1 Add `test/e2e/support/lstk.ts` exporting `start()`, `stop()`, `terraformApply()`, `terraformDestroy()`, each shelling out via `execFile`/`promisify`, throwing an `Error` with captured stdout/stderr on non-zero exit. +- [ ] 4.2 Add `test/e2e/fixtures/terraform/main.tf`, a plain `aws`-provider Terraform config (`~> 5.0`, `region = "us-east-1"`, plus `archive` `~> 2.0` in `required_providers`) declaring the wired application: + - `data "archive_file" "lambda"` with the handler source inline (`source { filename = "index.py", content = <<EOF ... EOF }`) and `output_path` under the fixture directory — no separate handler file or checked-in zip. + - `aws_s3_bucket` ("wdio-e2e-test-bucket") — no configurable fields set beyond the name (see design.md). + - `aws_sqs_queue` ("wdio-e2e-test-queue") with non-default `visibility_timeout_seconds` (≥ the Lambda function's timeout), `message_retention_seconds`, and `delay_seconds`. + - `aws_sns_topic` ("wdio-e2e-test-topic") with non-default `display_name`. + - `aws_sns_topic_subscription` (protocol `sqs`) from the topic to the queue, plus an `aws_sqs_queue_policy` granting the topic permission to send to the queue. + - `aws_iam_role` ("wdio-e2e-test-function-role") with a Lambda-trusting assume-role policy and non-default `path`, `description`, and `max_session_duration`. + - `aws_lambda_function` ("wdio-e2e-test-function") using the role above, `data.archive_file.lambda`'s `output_path`/`output_base64sha256` (as `filename`/`source_code_hash`), and non-default `description`, `memory_size`, and `timeout`; sets a `BUCKET_NAME` environment variable pointing at the S3 bucket. + - `aws_lambda_event_source_mapping` from the SQS queue to the Lambda function. + +## 5. Demonstration Suite + +- [ ] 5.1 Add `test/e2e/specs/resource-browser.e2e.ts` with `suiteSetup`/`suiteTeardown` calling the `lstk` helper (`start()` + `terraformApply()` / `terraformDestroy()` + `stop()`, teardown steps individually `.catch()`-guarded). +- [ ] 5.2 Implement tree-walking helpers (`labelsOf`, `findByLabelAndDescription`, `waitForResourcesTree`) that enable the resource browser opt-in, open the `LocalStack` activity bar view, retry-refresh until the `Profile: localstack` → region → service/resource-type rows resolve, and return the resolved tree items — matching rows by `(label, description)` pairs (not label alone) since Lambda's two resource types both render as `Lambda`-labeled rows. +- [ ] 5.3 Implement Resource Details helpers (`waitForDetailsTable`, `readResourceDetails`) that select a tree item, wait for the webview to appear, poll its `<table>` until populated, and return a field-name → value map. +- [ ] 5.4 Implement the `test(...)` body per `specs/e2e-testing/spec.md`: assert the tree shows exactly the fixture's region/service-type rows and one resource under each (via an `assertExactly` sort-and-compare helper), assert the wiring itself (SNS subscription confirmed, event source mapping's source/target ARNs, Lambda's role ARN), then assert each resource's Resource Details field set and values — including every resource's explicitly-set non-default fields (three for IAM/Lambda/SQS, two for SNS, none for S3). + +## 6. `package.json` Scripts + +- [ ] 6.1 Add `"pretest:e2e": "pnpm run compile"` and `"test:e2e": "unset ELECTRON_RUN_AS_NODE && wdio run ./wdio.conf.ts"` to `package.json` scripts. + +## 7. CI + +- [ ] 7.1 Resolve the remaining Open Question from `design.md`: confirm the `lstk` CLI install mechanism for `ubuntu-latest` runners. +- [ ] 7.2 Add a `test-e2e` job to `.github/workflows/build.yml` (checkout, pnpm/Node setup, `pnpm install --frozen-lockfile`, install `lstk`, `xvfb-run -a pnpm test:e2e`), running on every pull request against `main` alongside the existing jobs, with: + - `env: LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }}` scoped to this job only (the secret itself is added to the GitHub repository outside this change). + - `if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository` so the job is skipped (not failed) on pull requests from forks, which never have access to repository secrets. + +## 8. Verification + +- [ ] 8.1 Run `pnpm test:e2e` locally end-to-end and confirm the demonstration suite passes against a real LocalStack instance. +- [ ] 8.2 Run `pnpm tsc`, `pnpm eslint`, and `pnpm biome ci .` and confirm none of them fail on or attempt to check `test/e2e/**`/`wdio.conf.ts` incorrectly (lint should check them via the dedicated project; the root type-check should skip them). +- [ ] 8.3 Push a branch/PR and confirm the new CI job runs and passes. From 049ff6f85d769c9da34c094d142ff7e35794a262 Mon Sep 17 00:00:00 2001 From: Peter Smith <peter.smith@localstack.cloud> Date: Mon, 13 Jul 2026 10:26:54 +1200 Subject: [PATCH 2/7] feat(e2e): add WebdriverIO e2e test framework and demonstration suite Adds a pnpm test:e2e target (WebdriverIO + wdio-vscode-service) that drives the extension's real rendered UI in a genuine Extension Development Host, independent of the existing in-process vscode-test suite. Includes a demonstration suite that deploys a small wired serverless application (S3, Lambda, IAM, SQS, SNS) via Terraform against a real LocalStack instance and verifies the Resources tree/Resource Details end to end, plus a new CI job wiring it into every pull request. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --- .github/workflows/build.yml | 40 + .gitignore | 6 + .nvmrc | 1 + eslint.config.mjs | 14 + .../add-webdriverio-e2e-testing/design.md | 39 +- .../add-webdriverio-e2e-testing/proposal.md | 2 +- .../specs/e2e-testing/spec.md | 19 +- .../add-webdriverio-e2e-testing/tasks.md | 50 +- package.json | 12 +- pnpm-lock.yaml | 3903 +++++++++++++++-- pnpm-workspace.yaml | 21 + .../terraform/small-serverless/main.tf | 123 + test/e2e/fixtures/workspace/.gitkeep | 0 test/e2e/global.d.ts | 13 + test/e2e/specs/resource-browser.e2e.ts | 541 +++ test/e2e/support/lstk.ts | 51 + test/e2e/tsconfig.json | 26 + tsconfig.json | 3 +- wdio.conf.ts | 59 + 19 files changed, 4570 insertions(+), 353 deletions(-) create mode 100644 .nvmrc create mode 100644 test/e2e/fixtures/terraform/small-serverless/main.tf create mode 100644 test/e2e/fixtures/workspace/.gitkeep create mode 100644 test/e2e/global.d.ts create mode 100644 test/e2e/specs/resource-browser.e2e.ts create mode 100644 test/e2e/support/lstk.ts create mode 100644 test/e2e/tsconfig.json create mode 100644 wdio.conf.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1a77f68..09f36bc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -109,3 +109,43 @@ jobs: - name: Test run: xvfb-run -a pnpm vscode-test + + test-e2e: + name: Test (e2e) + runs-on: ubuntu-latest + # Fork PRs never have access to repository secrets (LOCALSTACK_AUTH_TOKEN + # below), so this job is skipped rather than failed for them; it still + # runs for same-repo branches/pushes. The event_name check keeps this + # from misfiring on non-pull_request triggers. + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository + + steps: + - name: Checkout + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + persist-credentials: false + + - name: Setup pnpm + uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 + + - name: Setup Node + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + # Pinned explicitly (unlike the other jobs) because wdio-vscode-service's + # WebSocket handshake with the launched Extension Development Host is + # sensitive to the Node net module's connection behavior — confirmed + # during local verification that a too-new Node major (26) breaks it, + # while this repo's own .node-version (24) works. + node-version-file: .node-version + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Install lstk + run: npm install -g @localstack/lstk + + - name: Test (e2e) + run: xvfb-run -a pnpm test:e2e + env: + LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }} diff --git a/.gitignore b/.gitignore index 3fe5c29..c56570d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,9 @@ /*.vsix /.env /idea +.wdio-vscode-service +/test/e2e/logs/ +/test/e2e/fixtures/terraform/**/.terraform/ +/test/e2e/fixtures/terraform/**/.terraform.lock.hcl +/test/e2e/fixtures/terraform/**/terraform.tfstate* +/test/e2e/fixtures/terraform/**/*.zip diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/eslint.config.mjs b/eslint.config.mjs index 9b2c21d..f99276e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -44,6 +44,20 @@ export default defineConfig( ], }, }, + { + // The root tsconfig.json excludes test/ and wdio.conf.ts (so `tsc`/ + // `check-types` doesn't try to compile the e2e suite as part of the + // extension itself), so the projectService above never finds a project + // covering these files. Point it at their own tsconfig instead. + files: ["test/e2e/**/*.ts", "wdio.conf.ts"], + languageOptions: { + parserOptions: { + projectService: false, + project: ["./test/e2e/tsconfig.json"], + tsconfigRootDir: import.meta.dirname, + }, + }, + }, { extends: [ importPlugin.flatConfigs.recommended, diff --git a/openspec/changes/add-webdriverio-e2e-testing/design.md b/openspec/changes/add-webdriverio-e2e-testing/design.md index d0864ba..2822f65 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/design.md +++ b/openspec/changes/add-webdriverio-e2e-testing/design.md @@ -13,6 +13,7 @@ The extension already has one automated test layer: `pnpm test` (`vscode-test` / **Non-Goals:** - Implementing the broader backlog of UI-level scenarios described in `openspec/specs/resource-browser/spec.md` (profiles/regions selectors, Views, stack-focus, per-resource-type coverage, opt-in gating). Those are follow-up work. - Building any tree-structure handling for a dedicated "global"/region-less service concept. IAM is deliberately asserted against its current, incidental placement (see Decisions) — a real global-region concept is expected to land as separate future work. +- Making Lambda event source mappings discoverable through the Resources view's Default View, or making SNS's subscription-count fields reflect real subscription state. Both depend on LocalStack behavior confirmed absent during verification (see Decisions) — LocalStack/extension changes, not something this framework change attempts to fix. - Replacing or modifying the existing `vscode-test` suite/job — the two suites are complementary and both keep running. - Cross-browser or multi-OS WebDriver support — `capabilities` only configures `browserName: "vscode"`. @@ -26,13 +27,21 @@ The extension already has one automated test layer: `pnpm test` (`vscode-test` / **Shell out to `lstk` directly for lifecycle, never `localstack.start`/`localstack.stop` commands.** The extension's own `startLocalStack()` (`src/utils/manage.ts`) spawns `lstk start --no-banner --detached` targeting an older CLI shape and isn't reliable against the current `lstk` binary. `lstk start` (invoked directly, not through the extension) blocks until the emulator is ready and needs no AWS profile — the Resources view's default LocalStack account is populated from the emulator's own metamodel endpoint (`computeMetamodelFocus`/`computeDefaultView` in `src/platforms/aws/models/metamodelFocus.ts`), not AWS credentials. `lstk tf` (alias for `lstk terraform`) is a `tflocal`-style wrapper: plain `aws`-provider Terraform files run unmodified against the emulator, no endpoint overrides needed in the fixture, and resources are already present in the emulator by the time `lstk tf apply` returns. -**Fixture-per-suite Terraform under `test/e2e/fixtures/terraform/`, applied/destroyed in `suiteSetup`/`suiteTeardown`.** Mirrors how a real user would deploy, and keeps the demonstration suite's teardown resilient (`.catch(() => undefined)` on both `terraformDestroy()` and `stop()`) so a failed assertion doesn't leave the emulator running or the fixture's state dangling for the next CI run. +**Fixture-per-suite Terraform under `test/e2e/fixtures/terraform/<fixture-name>/`, applied/destroyed in `suiteSetup`/`suiteTeardown`.** This demonstration suite's fixture lives at `test/e2e/fixtures/terraform/small-serverless/`, a named subdirectory rather than a single `terraform/main.tf` — future suites are expected to bring their own fixtures under sibling subdirectories (`fixtures/terraform/<other-name>/`), so `lstk.ts`'s `terraformApply`/`terraformDestroy` take a fixture name rather than assuming one fixture for the whole `test/e2e/` tree. Mirrors how a real user would deploy, and keeps the demonstration suite's teardown resilient (`.catch(() => undefined)` on both `terraformDestroy()` and `stop()`) so a failed assertion doesn't leave the emulator running or the fixture's state dangling for the next CI run. -**Poll/retry instead of fixed waits for tree and webview readiness.** VS Code's own tree refresh and the webview's `postMessage` round-trip aren't synchronously observable from WebDriver, so a `waitForResourcesTree` helper uses a bounded retry loop (clicking `Refresh Resources`, backing off 3s→6s between attempts) rather than a fixed sleep, and a `waitForDetailsTable` helper uses `browser.waitUntil` polling for populated `table tr` rows. This avoids both flakiness (fixed short waits) and slow suites (fixed long waits). The demonstration suite closes each webview (`webview.close()`) right after reading it, matching the currently-selected webview via `browser.getWorkbench().getAllWebviews()[0]` rather than by title — the Resource Details webview's HTML has no `<title>`, and since the suite only ever has one webview open at a time, matching by position is sufficient. +**Poll/retry instead of fixed waits for tree and webview readiness.** VS Code's own tree refresh and the webview's `postMessage` round-trip aren't synchronously observable from WebDriver, so a `waitForResourcesTree` helper uses a bounded retry loop (clicking `Refresh Resources`, backing off 3s→8s between attempts, up to 10 attempts) rather than a fixed sleep, and a `waitForDetailsTable` helper uses `browser.waitUntil` polling for populated `table tr` rows. This avoids both flakiness (fixed short waits) and slow suites (fixed long waits). The demonstration suite closes each webview (`webview.close()`) right after reading it, matching the currently-selected webview via `browser.getWorkbench().getAllWebviews()[0]` rather than by title — the Resource Details webview's HTML has no `<title>`, and since the suite only ever has one webview open at a time, matching by position is sufficient. **Mocha `ui: "tdd"`, matching `src/test/**`'s existing style**, so `suite`/`test`/`suiteSetup`/`suiteTeardown` read the same across both suite types. Test timeout set generously (5 minutes) because the suite shells out to `lstk start` and `lstk tf apply`, both real wall-clock operations against a real emulator, not mocks. -**New CI job, not a replacement of the existing `Test` job in `build.yml`.** Add a `test-e2e` job alongside `format`/`lint`/`type-check`/`test`, running `xvfb-run -a pnpm test:e2e` (matching the existing job's `xvfb-run` pattern for `vscode-test`, since both need a virtual display in headless CI). Needs `lstk` (and Docker, for the emulator itself) available on the runner — see Open Questions. +**`capabilities[0].browserVersion` is `"stable"` — not pinned to a specific release.** The WebSocket handshake between `wdio-vscode-service`'s proxy and the launched Extension Development Host is sensitive to the local Node.js major version (Node 26 breaks it, Node 24 does not — see the Node-version Risk below), which can present as an opaque `Error: Connection timeout exceeded` with no other diagnostic. That's a Node-version issue, not a VS Code-version one: confirmed directly by testing `"stable"` (VS Code 1.128.0, Chromium 148) under Node 24, which passes cleanly. No version pinning is needed once the Node version is correct. + +**`wdio.conf.ts` sets a project-local top-level `cacheDir` for chromedriver, rather than leaving `@wdio/utils` default to `os.tmpdir()`.** Traced directly (`@wdio/utils`'s `getCacheDir(options, caps)`: `driverOptions.cacheDir || options.cacheDir || os.tmpdir()`) to the actual bug behind repeated "browser folder exists but the executable is missing" failures during verification: the shared, OS-wide temp directory is also where every *other* tool/process on the same machine caches its own chromedriver downloads, with no namespacing per project. An interrupted download there (network blip, a killed process) leaves a corrupt entry that silently breaks every subsequent run — not just this project's — until someone happens to notice and manually clears it. `wdio-vscode-service` already scopes its own VS Code binary cache to `.wdio-vscode-service/` (`DEFAULT_CACHE_PATH = path.join(process.cwd(), '.wdio-vscode-service')`); chromedriver just never got the same treatment from the layer above it. Pointing `cacheDir` at `.wdio-vscode-service/browser-cache` doesn't prevent a download from ever getting corrupted — `@puppeteer/browsers`' fetcher trusts folder-existence as completion with no checksum/completion-marker verification, an upstream gap not fixable from our config — but it confines any corruption to a single, already-gitignored, already-documented directory, turning recovery from "unrelated shared-tmp mystery" into `rm -rf .wdio-vscode-service`. + +**New CI job in the existing `build.yml`, not a separate workflow file or a replacement of the existing `Test` job.** Add a `test-e2e` job alongside `format`/`lint`/`type-check`/`test`, for consistency with that existing structure. It runs `xvfb-run -a pnpm test:e2e` (matching the existing job's `xvfb-run` pattern for `vscode-test`, since both need a virtual display in headless CI), after installing `lstk` via `npm install -g @localstack/lstk` (the package published to the npm registry, kept in sync with the CLI's own GitHub releases) — Docker itself is already preinstalled on `ubuntu-latest`. + +**The `test-e2e` job's `Setup Node` step explicitly pins `node-version-file: .node-version`, unlike the other four jobs (which specify no version at all).** Given the Node-version sensitivity discovered above, leaving this job to whatever Node version a runner image happens to default to would reintroduce the exact same risk under different conditions. Explicitly reading this repo's own `.node-version` (24) removes that ambiguity for the one job that's actually sensitive to it; the other jobs aren't touched since nothing established they're affected. + +**Added `.nvmrc` (mirroring `.node-version`'s `24`) alongside the existing `.node-version`, rather than replacing it or adding a custom version-check script.** `.node-version` alone didn't prevent the Node 26 failure locally — this repo's own convention was already correct, but `nvm` (what was actually in use) only auto-switches off `.nvmrc`, not `.node-version`, and nothing prompted a manual `nvm use`. Shipping both files means the common auto-switch hooks (`nvm`'s own, plus tools like `direnv`/`avn`/shell nvm plugins that also check `.nvmrc`) pick the right version up without a contributor needing to know this project has an unusually strict requirement. This is a repo-root file affecting the whole project's local dev experience, not something scoped to `test/e2e/`, since `.node-version` already had that same repo-wide scope. **`LOCALSTACK_AUTH_TOKEN` is required and comes from a repository secret, scoped only to the `test-e2e` job.** Despite S3/Lambda/IAM/SQS/SNS all being LocalStack Community (free-tier) *services*, the `lstk` CLI itself requires an authenticated session — a distinct requirement from which AWS services the fixture happens to use. The token is supplied as a plain job-level `env: LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }}`; no extra wiring is needed beyond that, since `lstk start` already forwards any `LOCALSTACK_`-prefixed host environment variable into the emulator. The secret is added directly to the GitHub repository outside this change (an admin action, not something this change's tasks perform). Following this repo's existing naming convention (`LOCALSTACK_BOT_TOKEN`, `VSCE_PAT`, `OVSX_PAT` in other workflows), `LOCALSTACK_AUTH_TOKEN` fits alongside them. @@ -42,7 +51,7 @@ if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.f ``` so it runs normally for same-repo branches/pushes and is skipped (shown grey, not red) for fork PRs — those PRs still get `format`/`lint`/`type-check`/`test`, just not e2e coverage until a maintainer pushes the branch into the main repo or merges it. The `event_name != 'pull_request'` half keeps the guard from misfiring on non-PR triggers (e.g. a direct push), where `github.event.pull_request` doesn't exist at all. -**Trust-policy pins in `pnpm-workspace.yaml` for wdio's transitive deps, not blanket `--frozen-lockfile` bypass.** `@wdio/repl@9.4.4` and `pino@9.14.0` trip pnpm's no-downgrade trust check on install. Both are legitimate: `@wdio/repl@9.4.4` keeps the same signing key as `8.40.3` (the last release with full npm provenance/SLSA attestation) — the regression is missing attestation metadata, not a takeover, consistent with the whole wdio v9 line changing its publish pipeline — while the later `9.16.2` (a different signing key entirely) stays blocked, hence pinning the override to `9.4.4`. `pino@9.14.0` is signed with npm's current registry key (active since the prior key expired 2025-01-29), the same registry-wide key rotation, not anything specific to `pino`. `edgedriver`/`geckodriver` are set to `allowBuilds: false` since only `browserName: "vscode"` is configured and there's no reason to let those packages' postinstall scripts fetch Edge/Firefox WebDriver binaries. +**Trust-policy pins in `pnpm-workspace.yaml` for wdio's transitive deps, not blanket `--frozen-lockfile` bypass.** `@wdio/repl@9.16.2` and `pino@9.14.0` trip pnpm's no-downgrade trust check on install — both `trustPolicyExclude`d rather than pinned backward, since both were verified legitimate. `@wdio/repl@9.16.2` is signed with a different npm key than `9.0.8`/`9.4.4`; verified directly against the npm registry that `@wdio/cli`, `@wdio/local-runner`, `@wdio/mocha-framework`, `@wdio/spec-reporter`, and `webdriverio` — every other wdio-org package this project depends on — show the *identical* keyid transition at the *exact same* `9.4.x`/`9.15.x` → `9.16.x` version boundary. That lockstep, org-wide pattern is what a coordinated publishing-pipeline change looks like (a rotated npm automation token, a CI migration); a genuine single-package compromise would show up as an anomaly on that one package while its siblings kept their old key, which is not what's observed here. `pino@9.14.0` is signed with npm's current registry key (active since the prior key expired 2025-01-29), the same registry-wide key rotation, not anything specific to `pino`. `edgedriver`/`geckodriver` are set to `allowBuilds: false` since only `browserName: "vscode"` is configured and there's no reason to let those packages' postinstall scripts fetch Edge/Firefox WebDriver binaries. **Fixture models a real wired small application, not five independent resources.** The Linear issue asks for "a small application," and Lambda's second tracked resource type (`event-source-mapping`, `lambda.ts:103-169`) gives a natural, real wiring point rather than an artificial one: @@ -51,8 +60,8 @@ SNS Topic ("wdio-e2e-test-topic") │ subscription (protocol: sqs) ▼ SQS Queue ("wdio-e2e-test-queue") ──event source mapping──▶ Lambda Function ("wdio-e2e-test-function") - │ role - ▼ + (real, deployed; not │ role + tree-visible — see below) ▼ IAM Role ("wdio-e2e-test-function-role") S3 Bucket ("wdio-e2e-test-bucket") ── referenced via the function's BUCKET_NAME @@ -63,6 +72,10 @@ S3 Bucket ("wdio-e2e-test-bucket") ── referenced via the function's BUCKET_N The SNS→SQS subscription needs a queue policy (`aws_sqs_queue_policy`) granting `sns.amazonaws.com` permission to send to the queue — ordinary Terraform for this pattern, not LocalStack-specific. IAM→Lambda is not optional wiring, just how `aws_lambda_function.role` works; it's listed here because it's also the mandatory dependency ordering Terraform resolves via resource references. +The event source mapping itself is real, deployed infrastructure (confirmed directly against a running instance: `State: Enabled`, correct `EventSourceArn`/`FunctionArn`) but is not asserted anywhere in the demonstration suite — see the Decision below on why it can't be. + +**Lambda event source mappings are deployed by the fixture but deliberately not asserted in the Resources tree or Resource Details — this is a confirmed LocalStack/extension-side gap, not a timing issue.** The Resources view's "Default View" auto-discovers a resource type only once LocalStack's metamodel snapshot (`_localstack/pods/state/metamodel`) records at least one call to that type's list operation. Querying a running instance directly during verification showed every other resource type's op recorded (`listBuckets`, `listQueues`, `listTopics`, `listRoles`, `listFunctions`) but never `listEventSourceMappings` — not even after the mapping reached `State: Enabled` and regardless of how long the suite polled. Widening the retry budget (see the Poll/retry Decision) was tried first and made no difference, which is exactly what this explanation predicts: no amount of refreshing changes what the metamodel snapshot contains. Fixing this would mean either changing how LocalStack's metamodel records this operation, or changing the extension's Default View discovery to not depend solely on the metamodel snapshot — both real product changes, out of scope for a testing-framework change. The fixture keeps deploying the mapping regardless, since it's genuine SQS→Lambda wiring for the "small application" narrative, independent of whether this suite can observe it through the UI. + **Up to three non-default field values per resource, never fewer than the resource's field set actually supports, never padded to force the count.** Checked directly against each service definition's `detail` list: | Resource | Non-default fields used | Count | Why | @@ -70,7 +83,7 @@ The SNS→SQS subscription needs a queue policy (`aws_sqs_queue_policy`) grantin | IAM Role | `Path` (e.g. `/service-role/`), `Description`, `MaxSessionDuration` (e.g. `7200`) | 3 | Exactly three configurable fields exist (`iam.ts:61-86`); use all three. | | Lambda Function | `Description`, `MemorySize`, `Timeout` | 3 | Eight configurable fields exist (`lambda.ts:60-101`); three chosen for clarity. | | SQS Queue | `VisibilityTimeout`, `MessageRetentionPeriod`, `DelaySeconds` | 3 | Six configurable fields exist (`sqs.ts`); `VisibilityTimeout` set ≥ the function's `Timeout` (standard SQS/Lambda practice, not just for the field count). | -| SNS Topic | `DisplayName` (explicit) + `SubscriptionsConfirmed` (flips 0→1 once the SQS subscription confirms) | 2 | `Policy`/`EffectiveDeliveryPolicy` are AWS-populated regardless of input — asserting "non-default" there would mean brittle JSON-content checks, not a real configuration choice. | +| SNS Topic | `DisplayName` | 1 | `Policy`/`EffectiveDeliveryPolicy` are AWS-populated regardless of input — asserting "non-default" there would mean brittle JSON-content checks, not a real configuration choice. `SubscriptionsConfirmed` was originally planned as a second (flipping 0→1 once the SQS subscription confirms), but verification confirmed LocalStack's `GetTopicAttributes` never updates that counter even once a real, non-pending subscription exists — an emulation gap, not a timing issue, so it's checked only for well-formedness rather than asserted as wiring-derived. | | S3 Bucket | — | 0 | `detail` list (`s3.ts:34-37`) is only `Name` + `Creation Date`; there is no configurable field beyond the required bucket name to set non-default. | **IAM's tree placement is asserted against current, incidental behavior — not a designed "global service" placement.** There is no region-less/"global" concept anywhere in the tree-building code (`Focus`/`ResourceRegionTreeItem`/`declarative/engine.ts` all treat every service identically); IAM's own `iam.ts:12` "global service" comment is descriptive prose the type system never reads. Because the fixture deploys into a single LocalStack region, the metamodel records the IAM role's activity under that one real region key, and `metamodelToFocus` only drops the empty-string `""` mirror key — so the role simply renders under the same region row as everything else, incidentally, not by design. The demonstration suite asserts exactly that shape. If a real "global region" concept is added to the product later, this assertion is expected to need revisiting — this change deliberately does not try to anticipate that design. @@ -81,13 +94,11 @@ The SNS→SQS subscription needs a queue policy (`aws_sqs_queue_policy`) grantin ## Risks / Trade-offs -- **[Risk] CI runner needs `lstk`, Docker, and enough resources to run a real LocalStack container** → the existing `test` job already runs on `ubuntu-latest` (Docker preinstalled); add an `lstk` install step (official install script/binary release) to the new job. Flagged as an Open Question below since the exact install mechanism for Linux CI hasn't been verified in this change. (`lstk tf init` also needs to download the `hashicorp/archive` provider alongside `hashicorp/aws` — the same registry-access requirement as today, not a new category of dependency.) +- **[Risk] CI runner needs `lstk`, Docker, and enough resources to run a real LocalStack container** → `ubuntu-latest` already has Docker preinstalled; the job installs `lstk` itself via `npm install -g @localstack/lstk` (see Decisions). (`lstk tf init` also needs to download the `hashicorp/archive` provider alongside `hashicorp/aws` — the same registry-access requirement as today, not a new category of dependency.) - **[Risk] New job materially increases PR CI wall-clock time** (spinning up a real container + Extension Development Host + WebDriver session, vs. the in-process `vscode-test` job) → acceptable for now since it's one demonstration suite; revisit parallelization/sharding once further e2e suites start landing. - **[Risk] Flaky tree/webview timing in CI** (slower/more contended than local dev) → mitigated by the bounded-retry `waitForResourcesTree` / `waitUntil`-polling `waitForDetailsTable` helpers rather than fixed sleeps, but CI-specific flakiness can't be fully ruled out until this actually runs in the pipeline a few times. - **[Trade-off] Terraform fixture state files (`terraform.tfstate*`, `.terraform/`, `.terraform.lock.hcl`) are runtime artifacts, not checked in** → `.gitignore`'d; each CI run starts from a clean fixture. Local runs will accumulate this state between manual `test:e2e` invocations, which is fine (matches ordinary Terraform workflow) but means a developer who force-kills a run mid-suite may need to `lstk tf destroy` by hand before the next one. -- **[Trade-off] SNS is asserted with only two non-default field values, S3 with none** → intentionally short of the "three" mentioned in the Linear issue, because that's genuinely all the extension's current Resource Details view exposes as configurable for those two resource types; padding further would mean asserting on values that aren't real configuration choices. - -## Open Questions - -- Exact `lstk` install step for the `ubuntu-latest` GitHub Actions runner (official install script vs. a pinned release binary vs. an `lstk`-provided GitHub Action) — needs a quick check against `github.com/localstack/lstk`'s release/install docs before writing the workflow step. -- Whether `build.yml` gains a new job or this is a separate workflow file scoped to PRs only (the issue says "a new GitHub Actions workflow") — leaning toward a new job in `build.yml` for consistency with the existing `format`/`lint`/`type-check`/`test` structure, final call left to tasks.md. +- **[Trade-off] SNS is asserted with only one non-default field value, S3 with none** → intentionally short of the "three" mentioned in the Linear issue. S3 genuinely has nothing else configurable in its Resource Details view. SNS's second candidate (`SubscriptionsConfirmed` reflecting the fixture's real SQS subscription) turned out unusable once verified against a running instance — LocalStack doesn't maintain that counter at all — so padding further would mean asserting on values that aren't real, observable configuration choices. +- **[Risk] `pnpm test:e2e` is sensitive to the local/CI Node.js major version** (confirmed: Node 26 breaks `wdio-vscode-service`'s WebSocket handshake; Node 24 — this repo's own `.node-version` — does not; VS Code's version is not the variable, confirmed by re-testing `"stable"` under Node 24 successfully) → mitigated on CI by explicitly pinning `node-version-file: .node-version` in the `test-e2e` job, and locally by shipping both `.nvmrc` and `.node-version` so common auto-switch tooling picks up the right version (see Decisions). Residual risk: nothing *forces* a contributor onto the right Node version if their tooling doesn't auto-switch on either file (no `engines.node` upper bound, no local pretest guard) — it would resurface as the same opaque 5-minute timeout, not a clear error message. +- **[Trade-off] The Lambda event source mapping is deployed but not observable through this suite** → real infrastructure exists and was independently confirmed working; the gap is in what the Resources tree currently surfaces, not in the fixture or the framework, and isn't something this change can or should fix. +- **[Trade-off] The SNS→SQS subscription's confirmation is deployed and genuinely real (verified directly: a non-`PendingConfirmation` `SubscriptionArn`) but not independently assertable via `SubscriptionsConfirmed`** → same shape of gap as the event source mapping: LocalStack's `GetTopicAttributes` doesn't track this counter, so the suite checks it for well-formedness only rather than claiming it proves the wiring. diff --git a/openspec/changes/add-webdriverio-e2e-testing/proposal.md b/openspec/changes/add-webdriverio-e2e-testing/proposal.md index 8f7e96f..aad340a 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/proposal.md +++ b/openspec/changes/add-webdriverio-e2e-testing/proposal.md @@ -5,7 +5,7 @@ The extension currently has only an in-process `vscode-test` suite (`pnpm test`) ## What Changes - Add a `test:e2e` pnpm target that runs WebdriverIO (`@wdio/cli`, `@wdio/local-runner`, `@wdio/mocha-framework`) with `wdio-vscode-service` against a real Extension Development Host, configured via a new `wdio.conf.ts`. -- Add `test/e2e/` housing the e2e suite: a `support/lstk.ts` helper that shells out to the `lstk` CLI (`start`/`stop`/`tf init`/`tf apply`/`tf destroy`), a Terraform fixture under `test/e2e/fixtures/terraform/`, an empty workspace fixture the Extension Development Host opens, and a `specs/` directory of `*.e2e.ts` suites. +- Add `test/e2e/` housing the e2e suite: a `support/lstk.ts` helper that shells out to the `lstk` CLI (`start`/`stop`/`tf init`/`tf apply`/`tf destroy`), a Terraform fixture under its own named subdirectory (`test/e2e/fixtures/terraform/small-serverless/`, leaving room for sibling fixtures as more suites land), an empty workspace fixture the Extension Development Host opens, and a `specs/` directory of `*.e2e.ts` suites. - Add a demonstration suite (`resource-browser.e2e.ts`) that starts LocalStack, deploys a small wired application via Terraform — an SNS topic fanning out to an SQS queue, which triggers a Lambda function (via an event source mapping) running under a dedicated IAM role, plus an S3 bucket referenced by the function — enables the resource browser opt-in, walks the Resources tree to confirm exactly those resources appear, and opens Resource Details for each to confirm the expected field sets and values. Each resource carries up to three explicitly-set non-default field values (fewer where the resource's Resource Details view doesn't expose that many configurable fields — see design.md). - Add a new GitHub Actions job (in `.github/workflows/build.yml`, or a new workflow file) that runs `test:e2e` on every pull request, using `xvfb-run` the same way the existing `Test` job does for `vscode-test`. - Supporting config: exclude `test/` and `wdio.conf.ts` from the root `tsconfig.json`'s type-checked set (with their own `test/e2e/tsconfig.json`), point ESLint's `test/e2e/**/*.ts` + `wdio.conf.ts` files at that tsconfig, ignore e2e run artifacts (`.wdio-vscode-service`, `test/e2e/logs/`, Terraform state/lock/plugin files) in `.gitignore`, and pin/allow the `wdio`-related packages' install-time trust checks in `pnpm-workspace.yaml`. diff --git a/openspec/changes/add-webdriverio-e2e-testing/specs/e2e-testing/spec.md b/openspec/changes/add-webdriverio-e2e-testing/specs/e2e-testing/spec.md index cf95688..010f373 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/specs/e2e-testing/spec.md +++ b/openspec/changes/add-webdriverio-e2e-testing/specs/e2e-testing/spec.md @@ -27,19 +27,26 @@ A demonstration e2e suite SHALL deploy a single Terraform fixture representing a #### Scenario: Fixture resources are wired, not independent - **WHEN** the fixture has been applied -- **THEN** the deployed SNS topic has a confirmed subscription delivering to the deployed SQS queue, the deployed SQS queue has an event source mapping targeting the deployed Lambda function, and the deployed Lambda function's role is the deployed IAM role +- **THEN** the deployed SNS topic has a confirmed subscription delivering to the deployed SQS queue, and the deployed Lambda function's role is the deployed IAM role ### Requirement: Demonstration suite validates Resources tree completeness The demonstration suite SHALL assert that the Resources tree — after enabling the resource browser opt-in and refreshing — shows exactly the fixture's deployed resources under exactly the expected profile/region/service rows, with no missing or stray entries, including the IAM role's current (region-collapsed) placement. #### Scenario: Tree shows exactly the deployed resources - **WHEN** the fixture has been applied and the Resources view has been refreshed -- **THEN** the tree shows exactly one region (matching the fixture's configured region), exactly the services/resource-types `IAM`/`Roles`, `Lambda`/`Functions`, `Lambda`/`Event Source Mappings`, `S3`/`Buckets`, `SNS`/`Topics`, and `SQS`/`Queues` under it, and exactly the fixture's one resource under each +- **THEN** the tree shows exactly one region (matching the fixture's configured region), exactly the services/resource-types `IAM`/`Roles`, `Lambda`/`Functions`, `S3`/`Buckets`, `SNS`/`Topics`, and `SQS`/`Queues` under it, and exactly the fixture's one resource under each #### Scenario: IAM's role is asserted at its current tree placement - **WHEN** the fixture's IAM role is located in the tree - **THEN** it appears under the same single region row as every other deployed resource, reflecting the tree-building code's current behavior rather than a dedicated region-less/"global" placement (which does not exist in the tree-building code as of this change) +### Requirement: Lambda event source mappings are not discoverable through the Resources view +Because LocalStack's metamodel snapshot does not record the `listEventSourceMappings` operation (confirmed directly against a running instance), the Resources view's Default View auto-discovery SHALL NOT include Lambda event source mappings as a resource type regardless of whether one exists and is `Enabled`. The demonstration suite SHALL NOT assert on this resource type's presence in the tree or its Resource Details; the fixture still deploys a real event source mapping as genuine SQS→Lambda wiring, independent of whether this suite can observe it. + +#### Scenario: Event source mapping row never appears in the Resources tree +- **WHEN** the fixture's Lambda event source mapping exists and has reached `State: Enabled` +- **THEN** the Resources tree's `Lambda` service shows only the `Functions` resource type, never `Event Source Mappings`, regardless of how many times the view is refreshed + ### Requirement: Demonstration suite validates Resource Details field sets and values The demonstration suite SHALL open the Resource Details panel for each deployed resource and assert both the exact set of field names shown and the correctness of field values, including each resource's explicitly-set non-default values. @@ -51,18 +58,14 @@ The demonstration suite SHALL open the Resource Details panel for each deployed - **WHEN** the deployed SQS queue is selected in the Resources tree - **THEN** Resource Details shows exactly the expected SQS field set, with `ARN`/`Name`/`Service` matching the fixture and the queue, and the fixture's explicitly-configured `Visibility Timeout`, `Message Retention Period`, and `Delay Seconds` values shown exactly as configured -#### Scenario: SNS topic details show correct fields, including explicitly-set and wiring-derived values +#### Scenario: SNS topic details show correct fields, including explicitly-set values - **WHEN** the deployed SNS topic is selected in the Resources tree -- **THEN** Resource Details shows exactly the expected SNS field set, with `Name`/`Service` matching the fixture and the topic, the fixture's explicitly-configured `Display Name` shown exactly as configured, and `Subscriptions Confirmed` equal to `1` reflecting the deployed SQS subscription +- **THEN** Resource Details shows exactly the expected SNS field set, with `Name`/`Service` matching the fixture and the topic, and the fixture's explicitly-configured `Display Name` shown exactly as configured #### Scenario: Lambda function details show correct fields, including explicitly-set values - **WHEN** the deployed Lambda function is selected in the Resources tree - **THEN** Resource Details shows exactly the expected Lambda function field set, with `Name`/`Service`/`Role` matching the fixture and the function's IAM role, and the fixture's explicitly-configured `Description`, `Memory Size`, and `Timeout` values shown exactly as configured -#### Scenario: Lambda event source mapping details show correct fields -- **WHEN** the deployed Lambda event source mapping is selected in the Resources tree -- **THEN** Resource Details shows exactly the expected event source mapping field set, with `Function ARN` matching the deployed Lambda function and `Event Source ARN` matching the deployed SQS queue - #### Scenario: IAM role details show correct fields, including explicitly-set values - **WHEN** the deployed IAM role is selected in the Resources tree - **THEN** Resource Details shows exactly the expected IAM role field set, with `Role Name` matching the fixture, and the fixture's explicitly-configured `Path`, `Description`, and `Max Session Duration` values shown exactly as configured diff --git a/openspec/changes/add-webdriverio-e2e-testing/tasks.md b/openspec/changes/add-webdriverio-e2e-testing/tasks.md index a6422a3..27d5d80 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/tasks.md +++ b/openspec/changes/add-webdriverio-e2e-testing/tasks.md @@ -1,26 +1,26 @@ ## 1. Dependencies & Workspace Trust Policy -- [ ] 1.1 Add devDependencies: `@wdio/cli@^9.29.1`, `@wdio/local-runner@^9.29.1`, `@wdio/mocha-framework@^9.29.1`, `@wdio/spec-reporter@^9.29.1`, `expect-webdriverio@^5.7.0`, `wdio-vscode-service@^8.0.0`, `webdriverio@^9.29.1`, `tsx@^4.22.4` (`@types/mocha` is already a devDependency). -- [ ] 1.2 Add `pnpm-workspace.yaml` entries needed for a clean `pnpm install --frozen-lockfile`: a `trustPolicyExclude` entry for `@wdio/repl@9.4.4` (retains the same signing key as `8.40.3`, the last release with full provenance/SLSA attestation — a metadata regression, not a takeover) and for `pino@9.14.0` (signed with npm's current post-rotation registry key), `allowBuilds: false` for `edgedriver`/`geckodriver` (pulled in transitively but unused since `capabilities` only configures `browserName: "vscode"`), and an `overrides` entry pinning `"@wdio/repl": 9.4.4` (the later `9.16.2` uses a different signing key entirely and should stay blocked). -- [ ] 1.3 Run `pnpm install` and confirm it completes without a trust-policy prompt or error. +- [x] 1.1 Add devDependencies: `@wdio/cli@^9.29.1`, `@wdio/local-runner@^9.29.1`, `@wdio/mocha-framework@^9.29.1`, `@wdio/spec-reporter@^9.29.1`, `expect-webdriverio@^5.7.0`, `wdio-vscode-service@^8.0.0`, `webdriverio@^9.29.1`, `tsx@^4.22.4` (`@types/mocha` is already a devDependency). +- [x] 1.2 Add `pnpm-workspace.yaml` entries needed for a clean `pnpm install --frozen-lockfile`: a `trustPolicyExclude` entry for `@wdio/repl@9.16.2` (different signing key than `9.0.8`/`9.4.4`, but confirmed via the npm registry that every other wdio-org package we depend on rotates identically at the same version boundary — a coordinated pipeline change, not a takeover) and for `pino@9.14.0` (signed with npm's current post-rotation registry key), plus `allowBuilds: false` for `edgedriver`/`geckodriver` (pulled in transitively but unused since `capabilities` only configures `browserName: "vscode"`). +- [x] 1.3 Run `pnpm install` and confirm it completes without a trust-policy prompt or error. ## 2. WebdriverIO Configuration -- [ ] 2.1 Add `wdio.conf.ts` at the repo root: `runner: "local"`, `outputDir: "test/e2e/logs"`, `specs: ["./test/e2e/specs/**/*.e2e.ts"]`, `maxInstances: 1`, `capabilities` with `browserName: "vscode"` / `browserVersion: "stable"` / `wdio:enforceWebDriverClassic: true` / `wdio:vscodeOptions.extensionPath` set to the repo root and `workspacePath` set to `test/e2e/fixtures/workspace`, `services: ["vscode"]`, `framework: "mocha"` with `mochaOpts.ui: "tdd"` and a 5-minute timeout, `reporters: ["spec"]`. -- [ ] 2.2 Add `test/e2e/tsconfig.json` extending the root `tsconfig.json`, with `skipLibCheck: true`, `types` covering `node`/`mocha`/`@wdio/mocha-framework`/`expect-webdriverio`/`wdio-vscode-service`, `include` covering `**/*.ts` and `../../wdio.conf.ts`, and an empty `exclude` override (so it isn't inherited from the root project). -- [ ] 2.3 Add `test/e2e/global.d.ts` with the triple-slash reference into `webdriverio`'s internal async type declarations, to bring `browser`/`$`/`$$` into scope as ambient globals. -- [ ] 2.4 Add `test/e2e/fixtures/workspace/.gitkeep` so the Extension Development Host has a workspace folder to open. +- [x] 2.1 Add `wdio.conf.ts` at the repo root: `runner: "local"`, `outputDir: "test/e2e/logs"`, `specs: ["./test/e2e/specs/**/*.e2e.ts"]`, `maxInstances: 1`, `capabilities` with `browserName: "vscode"` / `browserVersion: "stable"` / `wdio:enforceWebDriverClassic: true` / `wdio:vscodeOptions.extensionPath` set to the repo root and `workspacePath` set to `test/e2e/fixtures/workspace`, `services: ["vscode"]`, `framework: "mocha"` with `mochaOpts.ui: "tdd"` and a 5-minute timeout, `reporters: ["spec"]`. +- [x] 2.2 Add `test/e2e/tsconfig.json` extending the root `tsconfig.json`, with `skipLibCheck: true`, `types` covering `node`/`mocha`/`@wdio/mocha-framework`/`expect-webdriverio`/`wdio-vscode-service`, `include` covering `**/*.ts` and `../../wdio.conf.ts`, and an empty `exclude` override (so it isn't inherited from the root project). +- [x] 2.3 Add `test/e2e/global.d.ts` with the triple-slash reference into `webdriverio`'s internal async type declarations, to bring `browser`/`$`/`$$` into scope as ambient globals. +- [x] 2.4 Add `test/e2e/fixtures/workspace/.gitkeep` so the Extension Development Host has a workspace folder to open. ## 3. Root Config Updates (tsconfig, eslint, gitignore) -- [ ] 3.1 Add `"exclude": ["node_modules", "out", "test", "wdio.conf.ts"]` to the root `tsconfig.json`. -- [ ] 3.2 Add an ESLint override in `eslint.config.mjs` for `files: ["test/e2e/**/*.ts", "wdio.conf.ts"]` that disables `projectService` and sets `parserOptions.project` to `["./test/e2e/tsconfig.json"]` with `tsconfigRootDir: import.meta.dirname`. -- [ ] 3.3 Add to `.gitignore`: `.wdio-vscode-service`, `/test/e2e/logs/`, `/test/e2e/fixtures/terraform/.terraform/`, `/test/e2e/fixtures/terraform/.terraform.lock.hcl`, `/test/e2e/fixtures/terraform/terraform.tfstate*`, `/test/e2e/fixtures/terraform/*.zip` (the `archive_file`-generated Lambda package). +- [x] 3.1 Add `"exclude": ["node_modules", "out", "test", "wdio.conf.ts"]` to the root `tsconfig.json`. +- [x] 3.2 Add an ESLint override in `eslint.config.mjs` for `files: ["test/e2e/**/*.ts", "wdio.conf.ts"]` that disables `projectService` and sets `parserOptions.project` to `["./test/e2e/tsconfig.json"]` with `tsconfigRootDir: import.meta.dirname`. +- [x] 3.3 Add to `.gitignore`: `.wdio-vscode-service`, `/test/e2e/logs/`, `/test/e2e/fixtures/terraform/**/.terraform/`, `/test/e2e/fixtures/terraform/**/.terraform.lock.hcl`, `/test/e2e/fixtures/terraform/**/terraform.tfstate*`, `/test/e2e/fixtures/terraform/**/*.zip` (`**` so every per-suite fixture subdirectory is covered, not just this one; the `archive_file`-generated Lambda package is one of the `*.zip` matches). ## 4. `lstk`/Terraform Support Helper & Fixture -- [ ] 4.1 Add `test/e2e/support/lstk.ts` exporting `start()`, `stop()`, `terraformApply()`, `terraformDestroy()`, each shelling out via `execFile`/`promisify`, throwing an `Error` with captured stdout/stderr on non-zero exit. -- [ ] 4.2 Add `test/e2e/fixtures/terraform/main.tf`, a plain `aws`-provider Terraform config (`~> 5.0`, `region = "us-east-1"`, plus `archive` `~> 2.0` in `required_providers`) declaring the wired application: +- [x] 4.1 Add `test/e2e/support/lstk.ts` exporting `start()`, `stop()`, `terraformApply(fixture)`, `terraformDestroy(fixture)`, each shelling out via `execFile`/`promisify`, throwing an `Error` with captured stdout/stderr on non-zero exit. `terraformApply`/`terraformDestroy` take a fixture name (resolved under `fixtures/terraform/<fixture>/`) rather than assuming a single fixture for the whole `test/e2e/` tree, since future suites bring their own. +- [x] 4.2 Add `test/e2e/fixtures/terraform/small-serverless/main.tf` (its own named subdirectory, leaving room for sibling fixtures as more suites land), a plain `aws`-provider Terraform config (`~> 5.0`, `region = "us-east-1"`, plus `archive` `~> 2.0` in `required_providers`) declaring the wired application: - `data "archive_file" "lambda"` with the handler source inline (`source { filename = "index.py", content = <<EOF ... EOF }`) and `output_path` under the fixture directory — no separate handler file or checked-in zip. - `aws_s3_bucket` ("wdio-e2e-test-bucket") — no configurable fields set beyond the name (see design.md). - `aws_sqs_queue` ("wdio-e2e-test-queue") with non-default `visibility_timeout_seconds` (≥ the Lambda function's timeout), `message_retention_seconds`, and `delay_seconds`. @@ -32,24 +32,32 @@ ## 5. Demonstration Suite -- [ ] 5.1 Add `test/e2e/specs/resource-browser.e2e.ts` with `suiteSetup`/`suiteTeardown` calling the `lstk` helper (`start()` + `terraformApply()` / `terraformDestroy()` + `stop()`, teardown steps individually `.catch()`-guarded). -- [ ] 5.2 Implement tree-walking helpers (`labelsOf`, `findByLabelAndDescription`, `waitForResourcesTree`) that enable the resource browser opt-in, open the `LocalStack` activity bar view, retry-refresh until the `Profile: localstack` → region → service/resource-type rows resolve, and return the resolved tree items — matching rows by `(label, description)` pairs (not label alone) since Lambda's two resource types both render as `Lambda`-labeled rows. -- [ ] 5.3 Implement Resource Details helpers (`waitForDetailsTable`, `readResourceDetails`) that select a tree item, wait for the webview to appear, poll its `<table>` until populated, and return a field-name → value map. -- [ ] 5.4 Implement the `test(...)` body per `specs/e2e-testing/spec.md`: assert the tree shows exactly the fixture's region/service-type rows and one resource under each (via an `assertExactly` sort-and-compare helper), assert the wiring itself (SNS subscription confirmed, event source mapping's source/target ARNs, Lambda's role ARN), then assert each resource's Resource Details field set and values — including every resource's explicitly-set non-default fields (three for IAM/Lambda/SQS, two for SNS, none for S3). +- [x] 5.1 Add `test/e2e/specs/resource-browser.e2e.ts` with `suiteSetup`/`suiteTeardown` calling the `lstk` helper (`start()` + `terraformApply("small-serverless")` / `terraformDestroy("small-serverless")` + `stop()`, teardown steps individually `.catch()`-guarded). +- [x] 5.2 Implement tree-walking helpers (`labelsOf`, `findByLabelAndDescription`, `waitForResourcesTree`) that enable the resource browser opt-in, open the `LocalStack` activity bar view, retry-refresh until the `Profile: localstack` → region → service/resource-type rows resolve, and return the resolved tree items — matching rows by `(label, description)` pairs (not label alone) since Lambda's two resource types both render as `Lambda`-labeled rows. +- [x] 5.3 Implement Resource Details helpers (`waitForDetailsTable`, `readResourceDetails`) that select a tree item, wait for the webview to appear, poll its `<table>` until populated, and return a field-name → value map. +- [x] 5.4 Implement the `test(...)` body per `specs/e2e-testing/spec.md`: assert the tree shows exactly the fixture's region/service-type rows and one resource under each (via an `assertExactly` sort-and-compare helper; the Lambda event source mapping is deployed but deliberately excluded here — LocalStack's metamodel never records `listEventSourceMappings`, confirmed during verification, so it never becomes tree-discoverable), assert the wiring itself (Lambda's role ARN), then assert each resource's Resource Details field set and values — including every resource's explicitly-set non-default fields (three for IAM/Lambda/SQS, one for SNS, none for S3; SNS's subscription counters are checked for well-formedness only, not asserted as wiring-derived — LocalStack's `GetTopicAttributes` never updates them, confirmed during verification). ## 6. `package.json` Scripts -- [ ] 6.1 Add `"pretest:e2e": "pnpm run compile"` and `"test:e2e": "unset ELECTRON_RUN_AS_NODE && wdio run ./wdio.conf.ts"` to `package.json` scripts. +- [x] 6.1 Add `"pretest:e2e": "pnpm run compile"` and `"test:e2e": "unset ELECTRON_RUN_AS_NODE && wdio run ./wdio.conf.ts"` to `package.json` scripts. ## 7. CI -- [ ] 7.1 Resolve the remaining Open Question from `design.md`: confirm the `lstk` CLI install mechanism for `ubuntu-latest` runners. -- [ ] 7.2 Add a `test-e2e` job to `.github/workflows/build.yml` (checkout, pnpm/Node setup, `pnpm install --frozen-lockfile`, install `lstk`, `xvfb-run -a pnpm test:e2e`), running on every pull request against `main` alongside the existing jobs, with: +- [x] 7.1 Confirm the `lstk` CLI install mechanism for `ubuntu-latest` runners: `npm install -g @localstack/lstk`. +- [x] 7.2 Add a `test-e2e` job to `.github/workflows/build.yml` (checkout, pnpm/Node setup, `pnpm install --frozen-lockfile`, install `lstk`, `xvfb-run -a pnpm test:e2e`), running on every pull request against `main` alongside the existing jobs, with: - `env: LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }}` scoped to this job only (the secret itself is added to the GitHub repository outside this change). - `if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository` so the job is skipped (not failed) on pull requests from forks, which never have access to repository secrets. ## 8. Verification -- [ ] 8.1 Run `pnpm test:e2e` locally end-to-end and confirm the demonstration suite passes against a real LocalStack instance. -- [ ] 8.2 Run `pnpm tsc`, `pnpm eslint`, and `pnpm biome ci .` and confirm none of them fail on or attempt to check `test/e2e/**`/`wdio.conf.ts` incorrectly (lint should check them via the dedicated project; the root type-check should skip them). +- [x] 8.1 Run `pnpm test:e2e` locally end-to-end and confirm the demonstration suite passes against a real LocalStack instance. +- [x] 8.2 Run `pnpm tsc`, `pnpm eslint`, and `pnpm biome ci .` and confirm none of them fail on or attempt to check `test/e2e/**`/`wdio.conf.ts` incorrectly (lint should check them via the dedicated project; the root type-check should skip them). - [ ] 8.3 Push a branch/PR and confirm the new CI job runs and passes. + +## 9. Post-Verification Hardening + +- [x] 9.1 Revert `wdio.conf.ts`'s `capabilities[0].browserVersion` from `"1.90.0"` back to `"stable"`, now that the real root cause (Node major version, not VS Code) is confirmed — re-verified passing against VS Code 1.128.0/Chromium 148 under Node 24. +- [x] 9.2 Add `.nvmrc` (content `24`, mirroring `.node-version`) at the repo root so `nvm`'s own auto-switch hook (and other tools that read `.nvmrc`) picks up the correct Node version automatically, since `.node-version` alone wasn't being honored by the `nvm` installation actually in use. +- [x] 9.3 Add a project-local top-level `cacheDir` (`.wdio-vscode-service/browser-cache`) to `wdio.conf.ts`, so chromedriver's download cache is no longer the shared, unnamespaced `os.tmpdir()` that other tools/processes on the same machine also write to — confining any future interrupted-download corruption to a single, already-gitignored, easy-to-clear directory. +- [x] 9.4 Move the Terraform fixture into its own named subdirectory (`test/e2e/fixtures/terraform/small-serverless/main.tf`), generalize `lstk.ts`'s `terraformApply`/`terraformDestroy` to take a fixture name instead of assuming a single fixture, update the demonstration suite's `suiteSetup`/`suiteTeardown` calls accordingly, and generalize the `.gitignore` Terraform-artifact patterns with `**` so sibling fixture subdirectories are covered without further edits — anticipating that more suites (and their own fixtures) will land here. +- [x] 9.5 Upgrade `@wdio/repl` from the backward-pinned `9.4.4` to the naturally-resolved `9.16.2`: verify via the npm registry that every other wdio-org package this project depends on shows the identical keyid transition at the same version boundary (confirming a coordinated pipeline change, not a takeover), then swap `pnpm-workspace.yaml`'s `trustPolicyExclude`/`overrides` entries accordingly and `pnpm clean --lockfile && pnpm install` to rebuild the lockfile cleanly. diff --git a/package.json b/package.json index d81a29f..cda534a 100644 --- a/package.json +++ b/package.json @@ -330,7 +330,9 @@ "check-types": "tsc", "lint": "eslint", "format": "biome check", - "test": "vscode-test" + "test": "vscode-test", + "pretest:e2e": "pnpm run compile", + "test:e2e": "unset ELECTRON_RUN_AS_NODE && wdio run ./wdio.conf.ts" }, "devDependencies": { "@aws-sdk/client-account": "^3.1079.0", @@ -368,10 +370,15 @@ "@vscode/test-cli": "^0.0.15", "@vscode/test-electron": "^2.5.2", "@vscode/vsce": "^3.9.1", + "@wdio/cli": "^9.29.1", + "@wdio/local-runner": "^9.29.1", + "@wdio/mocha-framework": "^9.29.1", + "@wdio/spec-reporter": "^9.29.1", "chokidar": "^4.0.3", "esbuild": "^0.28.0", "eslint": "^9.39.4", "eslint-plugin-import": "^2.32.0", + "expect-webdriverio": "^5.7.0", "fs-extra": "^11.3.6", "js-ini": "^1.6.0", "ms": "^2.1.3", @@ -380,10 +387,13 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "react-router-dom": "^6.30.1", + "tsx": "^4.22.4", "typescript": "^5.9.3", "typescript-eslint": "^8.62.1", "uuid": "^14.0.1", "vite": "^7.3.6", + "wdio-vscode-service": "^8.0.0", + "webdriverio": "^9.29.1", "zod": "^4.4.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f24be6..f7ac8c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,13 +77,13 @@ importers: version: 2.5.2 '@eslint/compat': specifier: ^2.0.5 - version: 2.1.0(eslint@9.39.4(supports-color@8.1.1)) + version: 2.1.0(eslint@9.39.4(jiti@2.7.0)) '@eslint/js': specifier: ^9.39.4 version: 9.39.4 '@localstack/appinspector-ui': specifier: ^1.0.158 - version: 1.0.158(09e585e523679aaf310539e99633db80) + version: 1.0.159(0b69306333cf32f83cd36f8060c1c18c) '@localstack/integrations': specifier: ^1.2.2 version: 1.2.2(@emotion/react@11.14.0(@types/react@17.0.93)(react@17.0.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.93)(react@17.0.2))(@types/react@17.0.93)(react@17.0.2))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -110,16 +110,28 @@ importers: version: 1.125.0 '@vitejs/plugin-react': specifier: ^5.1.0 - version: 5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@20.19.43)) + version: 5.2.0(vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.0)) '@vscode/test-cli': specifier: ^0.0.15 version: 0.0.15 '@vscode/test-electron': specifier: ^2.5.2 - version: 2.5.2(supports-color@8.1.1) + version: 2.5.2 '@vscode/vsce': specifier: ^3.9.1 - version: 3.9.2(supports-color@8.1.1) + version: 3.9.2 + '@wdio/cli': + specifier: ^9.29.1 + version: 9.29.1(@types/node@20.19.43)(expect-webdriverio@5.7.0) + '@wdio/local-runner': + specifier: ^9.29.1 + version: 9.29.1(@wdio/globals@9.29.1)(webdriverio@9.29.1) + '@wdio/mocha-framework': + specifier: ^9.29.1 + version: 9.29.1 + '@wdio/spec-reporter': + specifier: ^9.29.1 + version: 9.29.1 chokidar: specifier: ^4.0.3 version: 4.0.3 @@ -128,10 +140,13 @@ importers: version: 0.28.1 eslint: specifier: ^9.39.4 - version: 9.39.4(supports-color@8.1.1) + version: 9.39.4(jiti@2.7.0) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.39.4(supports-color@8.1.1)) + version: 2.32.0(@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)) + expect-webdriverio: + specifier: ^5.7.0 + version: 5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.29.1) fs-extra: specifier: ^11.3.6 version: 11.3.6 @@ -156,18 +171,27 @@ importers: react-router-dom: specifier: ^6.30.1 version: 6.30.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + tsx: + specifier: ^4.22.4 + version: 4.23.0 typescript: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: specifier: ^8.62.1 - version: 8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + version: 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) uuid: specifier: ^14.0.1 version: 14.0.1 vite: specifier: ^7.3.6 - version: 7.3.6(@types/node@20.19.43) + version: 7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.0) + wdio-vscode-service: + specifier: ^8.0.0 + version: 8.0.0(webdriverio@9.29.1) + webdriverio: + specifier: ^9.29.1 + version: 9.29.1 zod: specifier: ^4.4.3 version: 4.4.3 @@ -376,16 +400,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@5.14.0': - resolution: {integrity: sha512-Dfl7hPZe9/JJwRhFFXHq2z1oHYBuGubmff3kWXOsd1AGgyXlqjNYAWuN/1JL/ZrcZBs8TKMjGSil6Rcc7E8VPQ==} + '@azure/msal-browser@5.16.0': + resolution: {integrity: sha512-Wc75FGnQgYpsm5jsOqn1H8AXsh8vXruA6vwip1nhjrJxwby7juxKAIVLr7csepmHiwdZGr6EwI5BlSc3PizEtQ==} engines: {node: '>=0.8.0'} - '@azure/msal-common@16.9.0': - resolution: {integrity: sha512-1MWGjqgUCRAYgLmVFZKp7fs3Rg1TFvIMgywY8ze2olNVvLlJoRThuoziWSDJuwwyJI5L4rnLb9Tyt5D9GvSLPw==} + '@azure/msal-common@16.11.0': + resolution: {integrity: sha512-UikJOtMwkFpZNzTH6Dqk8UTUPbow15zH3e0UjGYZy69lYENW/S05gMLhbxI2eonz66uALhIljvhsSMEb6+O30g==} engines: {node: '>=0.8.0'} - '@azure/msal-node@5.2.5': - resolution: {integrity: sha512-RUuewWk9JvWJS5Yiy8/74Lm1rQAWlrU/qg/Bgtk1jIauVRtnb9XKwS5Xg0J+Whwjesq9EVrBIFgQEP8vHxgezA==} + '@azure/msal-node@5.3.1': + resolution: {integrity: sha512-sqqv3L1UOI4KDXonNtbxPYUgbSWVXqxvmmb6BUw9n4P/UXgG+cVur3dLWQN4Cz7qQ+UJROCCxMXlksm7gIq0Sw==} engines: {node: '>=20'} '@babel/code-frame@7.29.7': @@ -536,6 +560,9 @@ packages: cpu: [x64] os: [win32] + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@dagrejs/dagre@1.1.8': resolution: {integrity: sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw==} @@ -804,6 +831,31 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fastify/accept-negotiator@1.1.0': + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + + '@fastify/ajv-compiler@3.6.0': + resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} + + '@fastify/cors@9.0.1': + resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + + '@fastify/send@2.1.0': + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + + '@fastify/static@7.0.4': + resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} + '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -824,6 +876,140 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -832,6 +1018,30 @@ packages: resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} engines: {node: '>=8'} + '@jest/diff-sequences@30.4.0': + resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.4.1': + resolution: {integrity: sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.4.0': + resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/schemas@30.4.1': + resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@30.4.1': + resolution: {integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -848,8 +1058,8 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@localstack/appinspector-ui@1.0.158': - resolution: {integrity: sha512-YaUvf1RWDJi4mIZ37Gov9NeGUB+oxwz+KXJsKdvwlUEQjxu8GHufavl3WIBPpYiLUplakMwqplzeJsFOOjmvPA==} + '@localstack/appinspector-ui@1.0.159': + resolution: {integrity: sha512-cm8SMMCMNFEleyFH7U9ro1PCqxHCR5QotB+6H7by6j48K4QooG0/GitRz7Ftyp0oayFt+DYQ+6pVsSBoB06BEA==} peerDependencies: '@dagrejs/dagre': ^1 '@emotion/react': ^11 @@ -869,6 +1079,10 @@ packages: peerDependencies: react: ^17.0.2 + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + '@mui/core-downloads-tracker@5.18.0': resolution: {integrity: sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==} @@ -967,6 +1181,9 @@ packages: '@types/react': optional: true + '@nodable/entities@2.2.0': + resolution: {integrity: sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -979,6 +1196,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -986,6 +1206,14 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@promptbook/utils@0.69.5': + resolution: {integrity: sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==} + + '@puppeteer/browsers@2.13.2': + resolution: {integrity: sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==} + engines: {node: '>=18'} + hasBin: true + '@remix-run/router@1.23.3': resolution: {integrity: sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==} engines: {node: '>=14.0.0'} @@ -1134,6 +1362,9 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@secretlint/config-creator@10.2.2': resolution: {integrity: sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==} engines: {node: '>=20.0.0'} @@ -1179,34 +1410,49 @@ packages: resolution: {integrity: sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==} engines: {node: '>=20.0.0'} + '@sinclair/typebox@0.34.49': + resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@smithy/core@3.29.0': - resolution: {integrity: sha512-sEvpvkBVoMxjoek35XyJFn2ZD3EJ1RpiZrT47WaZodxzAIWS44zkdvbqGE/ZlugtjiQp62cffYZ9ldyRkjAGnA==} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@smithy/core@3.29.1': + resolution: {integrity: sha512-qoiY4nrk5OCu1+eIR1VB8l5DmON/oKiqrd5zZFAhXJXjJlLWQusKEW/SkBDAtGDcPaz86m9kfcE1lngU0GlM6A==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.4.5': - resolution: {integrity: sha512-LnjUTNG0GgQlKIq7IioeOrPaEmC5xOd1WtAz24TLSiYQnWX2uHr53GrFuQhkrJBktPYCMga/NbUOW7hFbSA2Cg==} + '@smithy/credential-provider-imds@4.4.6': + resolution: {integrity: sha512-B2WQ/PV/H6Jeg3lrIq6bKUfa6Hy01mtK7CGs6lhjzHA6k4aagldH6T6eEjnzKl4HI0cJnAsxfJ19pgb5PV+CVQ==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.6.2': - resolution: {integrity: sha512-q96PSDOAGw+X+nuELd7Cjebps0SYr+YlPbviEX9sLVw+VM4M7VV8hn1nL1mGS6urDu33eQ5A7WhlphaDO6kUyQ==} + '@smithy/fetch-http-handler@5.6.3': + resolution: {integrity: sha512-CwCc/7SMTj45y97MUnDTbTaxvtAsiNNRm81z3abROIuMbMsC2Iy5EKfkkVdsKrz8WExQAAMx1EJapq+9j4fFTQ==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.9.2': - resolution: {integrity: sha512-s0yAIRj6TVfHgl+QzVyqal1KMGZ9B5512IrxKc6+dOpw8fUmFL3CvuAhjv0J+aNjUPfVZ2IhqPEDvkB5Ncx9oA==} + '@smithy/node-http-handler@4.9.3': + resolution: {integrity: sha512-qZTa4gQFUo8RM02rk6q5UVTDLNrQ1oS20LsepBzqq1QBVc/EHJ03OOUADcqMZiXHArW+Y7+OGY0BpdTwZRq/Yg==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.6.1': - resolution: {integrity: sha512-SqvuP75p/DmgWWI7jv4kf/UW+V4LFmlUn19s604SgAcRuJRB1vDnWwzZMYCLUcmKxko9wDn6iLgGEIpTNgZbIQ==} + '@smithy/signature-v4@5.6.2': + resolution: {integrity: sha512-QgHflghMoPxCJ9axiCVh8KZfbC9fuP6vkXXyK//E3cq7nLaSSyyLj0GAoqVWezYeDQmXIZhmlRvLE16jsqDK6g==} engines: {node: '>=18.0.0'} '@smithy/types@4.15.1': resolution: {integrity: sha512-x3L0XSACF6UYzKpa9biqiRMgvH5+wnFFew9Tm/grFYqgaupPwx/+ojDPpPJM8dZON3S9tjz5U+PQYsCBd1Mw5Q==} engines: {node: '>=18.0.0'} + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + '@textlint/ast-node-types@15.7.1': resolution: {integrity: sha512-Wii5UgUKFEh9Uv6wbq1zr4/Kf+dtjiUuzPrrXzKp8H+ifkvKNzi23V4Nz+6wVyHQn5T28AFuc8VH8OtzvGYecA==} @@ -1222,6 +1468,16 @@ packages: '@textlint/types@15.7.1': resolution: {integrity: sha512-Vye/GmFNBTgVzZFtIFJTmLB+s2A7oIADxNG6r9UhfPuY+Czv0z5G3xeyFZZudPlfxURsKUyPIU5XsjOFqVp33A==} + '@tokenizer/inflate@0.2.7': + resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1258,9 +1514,18 @@ packages: '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1307,9 +1572,30 @@ packages: '@types/scheduler@0.16.8': resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + '@types/sinonjs__fake-timers@8.1.5': + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/vscode@1.125.0': resolution: {integrity: sha512-0icm/ZQAaism87P0ekHqi4/Ju9du+Tm0RUW+y7vqRsxY2cY0FNRX1nAnaW7nT6npPt2tfHiheZ55Zm9UhqonFA==} + '@types/which@2.0.2': + resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@8.62.1': resolution: {integrity: sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1379,6 +1665,21 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} + + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} + + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + '@vscode/test-cli@0.0.15': resolution: {integrity: sha512-nAxk2X79wuXS7aOhyFFhFcCqd7EBUoMesu7ZgsYE/4eFjyBMuyIweVE94BxdKH1RieN8eOz2SIrljrZt6Lk9fQ==} engines: {node: '>=22'} @@ -1441,8 +1742,102 @@ packages: engines: {node: '>= 20'} hasBin: true - '@xyflow/react@12.11.0': - resolution: {integrity: sha512-na4IO33FSs2OS72hASgZDmTYwFAkef7Z74uBUVrong3ARmQQHfnRUVaCFn1kTt5LbS6pK03TbYjCPGLjLFfziA==} + '@wdio/cli@9.29.1': + resolution: {integrity: sha512-MjRHdM5mGuibhwv+pu8rJD1Pxl6JVj4Pvy9stuj/SjbTqWRxjLauLd3i7+tIMdmrK0ajGO0n249HT8vS8Mh0Dg==} + engines: {node: '>=18.20.0'} + hasBin: true + + '@wdio/config@9.29.1': + resolution: {integrity: sha512-8IXDiRG9wUUnpU6M/uzsVqIHJD/7o4y9RaOU2Jh/OdRJP/7rxwfGsa24Bv486rnMGdghztkwLCBJWG0jbeEtfw==} + engines: {node: '>=18.20.0'} + + '@wdio/dot-reporter@9.29.1': + resolution: {integrity: sha512-5UVgxKHVoJfJVSg3VH9n0yPkstHzX65g5zRBtNX51hqXmSPRE9kSLGq53Lo91UTORc0og3i0UT93zZqEQhpzjA==} + engines: {node: '>=18.20.0'} + + '@wdio/globals@9.29.1': + resolution: {integrity: sha512-F96BKppx4HGD64v+s57TM4K4zaxqUCg2RXHk6sjB2xrSa7P+d2VYV28ID2ddF7iSodVfPlpa1i2/jy8jMGrU8w==} + engines: {node: '>=18.20.0'} + peerDependencies: + expect-webdriverio: ^5.6.5 + webdriverio: ^9.0.0 + + '@wdio/local-runner@9.29.1': + resolution: {integrity: sha512-ypgi3gTZYY3eStp1U9H6Gjl0mer55CYMdbtRQ27s6evN1QABcwkGCTuzwqHoO6RmKzwPOuht2mnWb9HwYJaNnw==} + engines: {node: '>=18.20.0'} + + '@wdio/logger@9.29.1': + resolution: {integrity: sha512-0ZAEIo6PNyMIJPlOGkIgyOJUjcd0pC8/QHlVAAe1c91/IcjZ1X+k0yidXHaboJdN7dq1XPUacmhRdtua0U5EZg==} + engines: {node: '>=18.20.0'} + + '@wdio/mocha-framework@9.29.1': + resolution: {integrity: sha512-GG3z0OtD2eu15ql3vnI6VcLJ3INUfSrqbuop/tCAbCjkkKgpjq1JOno0lrDNKRt5Ndq4a4/c9Wu5uxfL+CItYw==} + engines: {node: '>=18.20.0'} + + '@wdio/protocols@9.29.1': + resolution: {integrity: sha512-NFlBQOA4zDb4D/ETpVMqDgbJyEqdhGRsJWybLOXG7PGlPwfcrfmTMHC1+Boq4KODgpwbhCmI9zIk2JQmGYIttQ==} + + '@wdio/repl@9.16.2': + resolution: {integrity: sha512-FLTF0VL6+o5BSTCO7yLSXocm3kUnu31zYwzdsz4n9s5YWt83sCtzGZlZpt7TaTzb3jVUfxuHNQDTb8UMkCu0lQ==} + engines: {node: '>=18.20.0'} + + '@wdio/reporter@9.29.1': + resolution: {integrity: sha512-CKAcVy9BGwvufokMcl3H+yNcvD11Klku/1BPz8bKSRv7/KzueXR06s1cPbJH3tv9r9zxPErxgdVMpulN8I0qAg==} + engines: {node: '>=18.20.0'} + + '@wdio/runner@9.29.1': + resolution: {integrity: sha512-LV9+0U74J1YModG0T64Kdnh+xvOcd9MWGFlKyXnCtfFDV+47K9BpoDMrc/ng3daLrIKcZGVbym+GhEShiM0DPQ==} + engines: {node: '>=18.20.0'} + peerDependencies: + expect-webdriverio: ^5.6.5 + webdriverio: ^9.0.0 + + '@wdio/spec-reporter@9.29.1': + resolution: {integrity: sha512-iqlHW/qGDRGmxQKN7XyCHxfKphTbPNnniV3yxNXZRSGHCCQok5KFKOnj4fpUCKEyD5jtPAmP6Y0qc1UyR3Dc3Q==} + engines: {node: '>=18.20.0'} + + '@wdio/types@9.29.1': + resolution: {integrity: sha512-jp8jgMv6TS35G96YzHZxw3PVN0Dz6xQ6tnMAicndAJ8Jt9AIXb0ywIse4TjaFywakO3dLoEhlyA3ZtR26vmt+w==} + engines: {node: '>=18.20.0'} + + '@wdio/utils@9.29.1': + resolution: {integrity: sha512-jyt6b6FfdYwVbMISVhuyGC1xQGZj6xM03KhTHozH7a9/zu9b++94KRdT9HRbwX8zefjW0YeIC5+qWSIf7WWHZg==} + engines: {node: '>=18.20.0'} + + '@wdio/xvfb@9.29.1': + resolution: {integrity: sha512-suC0EJcPVldpIyJA/UB9cV11PkW4sGgNmLHPhWU7NiASnbiFeHjK3EbevjzlwwBNYXx1KHO4jMY4Rep2wwVNuw==} + engines: {node: '>=18'} + + '@xhmikosr/archive-type@7.1.0': + resolution: {integrity: sha512-xZEpnGplg1sNPyEgFh0zbHxqlw5dtYg6viplmWSxUj12+QjU9SKu3U/2G73a15pEjLaOqTefNSZ1fOPUOT4Xgg==} + engines: {node: '>=18'} + + '@xhmikosr/decompress-tar@8.1.0': + resolution: {integrity: sha512-m0q8x6lwxenh1CrsTby0Jrjq4vzW/QU1OLhTHMQLEdHpmjR1lgahGz++seZI0bXF3XcZw3U3xHfqZSz+JPP2Gg==} + engines: {node: '>=18'} + + '@xhmikosr/decompress-tarbz2@8.1.0': + resolution: {integrity: sha512-aCLfr3A/FWZnOu5eqnJfme1Z1aumai/WRw55pCvBP+hCGnTFrcpsuiaVN5zmWTR53a8umxncY2JuYsD42QQEbw==} + engines: {node: '>=18'} + + '@xhmikosr/decompress-targz@8.1.0': + resolution: {integrity: sha512-fhClQ2wTmzxzdz2OhSQNo9ExefrAagw93qaG1YggoIz/QpI7atSRa7eOHv4JZkpHWs91XNn8Hry3CwUlBQhfPA==} + engines: {node: '>=18'} + + '@xhmikosr/decompress-unzip@7.1.0': + resolution: {integrity: sha512-oqTYAcObqTlg8owulxFTqiaJkfv2SHsxxxz9Wg4krJAHVzGWlZsU8tAB30R6ow+aHrfv4Kub6WQ8u04NWVPUpA==} + engines: {node: '>=18'} + + '@xhmikosr/decompress@10.2.1': + resolution: {integrity: sha512-ceGT3K2JR73Usj5o+HM2RRZw0XPUes4rhb7uVTY9PefUQQMpuj8x+V29XVG09JnS7EOj9SIBhHn3K4bFNNb7hA==} + engines: {node: '>=18'} + + '@xhmikosr/downloader@15.2.0': + resolution: {integrity: sha512-lAqbig3uRGTt0sHNIM4vUG9HoM+mRl8K28WuYxyXLCUT6pyzl4Y4i0LZ3jMEsCYZ6zjPZbO9XkG91OSTd4si7g==} + engines: {node: '>=18'} + + '@xyflow/react@12.11.1': + resolution: {integrity: sha512-L+zBoLGSXham0MnlY8QqjfR7/C5JNw0zxkaey5aZ5XmCgJBAdH4+WRIu8CR40d3l/BdU635V6YbhBK1jMo8/6Q==} peerDependencies: '@types/react': '>=17' '@types/react-dom': '>=17' @@ -1454,8 +1849,19 @@ packages: '@types/react-dom': optional: true - '@xyflow/system@0.0.77': - resolution: {integrity: sha512-qCDCMCQAAgUu8yHnhloHG9F5mwPX5E+Wl8McpYIOPSSXfzFJJoZcwOcsDiAjitVKIg2de1WmJbCHfpcvxprsgg==} + '@xyflow/system@0.0.78': + resolution: {integrity: sha512-lY0z2qP33fUhTva9Vaxrk0lqZta2pkbxB1trHAx1omnJqRtPvDlAQYV2r5fhS6AdpkulYmbNW0svy+A4/t4B/g==} + + '@zip.js/zip.js@2.8.26': + resolution: {integrity: sha512-RQ4h9F6DOiHxpdocUDrOl6xBM+yOtz+LkUol47AVWcfebGBDpZ7w7Xvz9PS24JgXvLGiXXzSAfdCdVy1tPlaFA==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1471,12 +1877,32 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -1497,13 +1923,36 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -1528,24 +1977,50 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + avvio@8.4.0: + resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + azure-devops-node-api@12.5.0: resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -1557,14 +2032,63 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.3: + resolution: {integrity: sha512-xRgplks8SvcKkdlv2M6Z2LZmRsmqd+x0nXXGXeMEjwdibj1HSDrlnqBRLeYdMvsgCox7Bq0e+DHwfczOfsn6IA==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.9.3: + resolution: {integrity: sha512-fF4Q7QsyKVF5Rj0qvI8BgUNjqzC2JvQlpTaPLjVJVxYVUX5Zr9un+y3w1HmA4nNKdFmRBT8z/WmrjvXzXVerKQ==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.1: + resolution: {integrity: sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==} + + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.5: + resolution: {integrity: sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.38: - resolution: {integrity: sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==} + baseline-browser-mapping@2.10.42: + resolution: {integrity: sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==} engines: {node: '>=6.0.0'} hasBin: true + basic-ftp@5.3.1: + resolution: {integrity: sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==} + engines: {node: '>=10.0.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + binaryextensions@6.11.0: resolution: {integrity: sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==} engines: {node: '>=4'} @@ -1598,20 +2122,27 @@ packages: browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + browserslist@4.28.4: + resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -1626,6 +2157,14 @@ packages: monocart-coverage-reports: optional: true + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1646,8 +2185,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001799: - resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + caniuse-lite@1.0.30001800: + resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1661,6 +2200,9 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -1668,6 +2210,10 @@ packages: resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} engines: {node: '>=20.18.1'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1679,6 +2225,10 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + classcat@5.0.5: resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==} @@ -1690,6 +2240,13 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1698,6 +2255,10 @@ packages: resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} engines: {node: '>=20'} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -1727,15 +2288,39 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1743,7 +2328,21 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} - cross-spawn@6.0.6: + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + create-wdio@9.29.1: + resolution: {integrity: sha512-EWef5jtJ9pN+tYblwZvWwDEKEgZSMy8VZCUCWBIiw3Z48aDbqusxpOseZWZ/rAttsqGyntzIvHLxIo0r7kryxw==} + engines: {node: '>=12.0.0'} + hasBin: true + + cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} @@ -1754,6 +2353,12 @@ packages: css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + css-shorthand-properties@1.1.2: + resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} + + css-value@0.0.1: + resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} + css-vendor@2.0.8: resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} @@ -1802,6 +2407,10 @@ packages: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -1835,10 +2444,22 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + decamelize@6.0.1: + resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -1846,6 +2467,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + default-browser-id@5.0.1: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} @@ -1854,6 +2479,17 @@ packages: resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defaults@2.0.2: + resolution: {integrity: sha512-cuIw0PImdp76AOfgkjbW4VhQODRmNNcKR73vdCH5cLd/ifj7aamfoXvYgfGkEAjNJZ3ozMIy9Gu2LutUkGEPbA==} + engines: {node: '>=16'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -1866,14 +2502,26 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + diff@8.0.4: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} @@ -1898,6 +2546,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1905,15 +2557,32 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + edge-paths@3.0.5: + resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} + engines: {node: '>=14.0.0'} + + edgedriver@6.3.0: + resolution: {integrity: sha512-ggEQL+oEyIcM4nP2QC3AtCQ04o4kDNefRM3hja0odvlPSnsaxiruMxEZ93v3gDCKWYW6BXUr51PPradb+3nffw==} + engines: {node: '>=20.0.0'} + hasBin: true + editions@6.22.0: resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==} engines: {ecmascript: '>= es5', node: '>=4'} - electron-to-chromium@1.5.375: - resolution: {integrity: sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.387: + resolution: {integrity: sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1981,8 +2650,8 @@ packages: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.1: - resolution: {integrity: sha512-CxN9N56HYfd2m/acc/NOFrZQsN9kU4eh+2kk6A707Kz1krH8tKmfrs5RnftB8WNX80T0NS7vSQsDOlg23diR2g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} esbuild@0.28.1: @@ -1994,19 +2663,31 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + eslint-import-resolver-node@0.3.10: resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} - eslint-module-utils@2.13.0: - resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} + eslint-module-utils@2.14.0: + resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2066,6 +2747,11 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -2082,13 +2768,69 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + expect-webdriverio@5.7.0: + resolution: {integrity: sha512-jLOTrJoPBC3Wtd83ryHMbRcEajMGtAnn6OWtSnoJoDLt16nHvxVdjcI4Bc0n+1KAOr8DvQtlJ55f0M48kJtEpw==} + engines: {node: '>=20'} + peerDependencies: + '@wdio/globals': ^9.0.0 + '@wdio/logger': ^9.0.0 + webdriverio: ^9.0.0 + + expect@30.4.1: + resolution: {integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + + ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2096,15 +2838,37 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-uri@3.1.3: + resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + + fast-xml-builder@1.2.1: + resolution: {integrity: sha512-tPb5TTWfgfVx5BNSi2xV0eLr89POeXXn0dXIsCJ9m1narrWxeIyx6je9d7Rce/3NyXLbvuQmLkxq+RuxMWejvw==} + + fast-xml-parser@5.9.3: + resolution: {integrity: sha512-brCNCeScma/kqa54J4PIDriSSSLssRkuYaUCpvHJulGc3HGI/xxKUCTDcYkAdqJsyb//ydpbxecjC3hB9+tb/g==} + hasBin: true + + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify@4.29.1: + resolution: {integrity: sha512-m2kMNHIG92tSNWv+Z3UeTR9AWLLuo7KctC7mlFPtMEVrfjIhmQhkQnT9v15qA/BfVq3vvj134Y0jl9SBje3jXQ==} fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2114,14 +2878,40 @@ packages: picomatch: optional: true + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-type@20.5.0: + resolution: {integrity: sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg==} + engines: {node: '>=18'} + + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + + filename-reserved-regex@3.0.0: + resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + filenamify@6.0.0: + resolution: {integrity: sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ==} + engines: {node: '>=16'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-my-way@8.2.2: + resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} + engines: {node: '>=14'} + find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -2129,6 +2919,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -2148,10 +2942,18 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + form-data@4.0.6: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -2159,6 +2961,9 @@ packages: resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} engines: {node: '>=14.14'} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2174,6 +2979,11 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + geckodriver@6.1.0: + resolution: {integrity: sha512-ZRXLa4ZaYTTgUO4Eefw+RsQCleugU2QLb1ME7qTYxxuRj51yAhfnXaItXNs5/vUzfIaDHuZ+YnSF005hfp07nQ==} + engines: {node: '>=20.0.0'} + hasBin: true + generator-function@2.0.1: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} @@ -2194,14 +3004,38 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + + get-port@7.2.0: + resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} + engines: {node: '>=16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -2222,6 +3056,11 @@ packages: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2238,9 +3077,16 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -2290,20 +3136,46 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@8.1.0: + resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} + engines: {node: ^18.17.0 || >=20.5.0} + + hpagent@1.2.0: + resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} + engines: {node: '>=14'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + htmlfy@0.8.1: + resolution: {integrity: sha512-xWROBw9+MEGwxpotll0h672KCaLrKKiCYzsyN8ZgL9cQbVumFnyvsk2JqiB9ELAV1GLj1GG/jxZUjV9OZZi/yQ==} + htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} @@ -2311,6 +3183,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2329,6 +3205,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2337,16 +3216,40 @@ packages: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} + inflight@1.0.6: + resolution: {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. + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inquirer@12.11.1: + resolution: {integrity: sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + inspect-with-kind@1.0.5: + resolution: {integrity: sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2362,6 +3265,10 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -2443,10 +3350,18 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -2459,6 +3374,14 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -2483,6 +3406,9 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} + is-unsafe@1.0.1: + resolution: {integrity: sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -2508,6 +3434,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -2527,16 +3457,45 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + jest-diff@30.4.1: + resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.4.1: + resolution: {integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.4.1: + resolution: {integrity: sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.4.1: + resolution: {integrity: sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-regex-util@30.4.0: + resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@30.4.1: + resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + js-ini@1.6.0: resolution: {integrity: sha512-9Vx+NVkMRNY4i7pLLIGdXIQbP1iwB3fP2IG1zMCgeUUvR1ODmTKa33eR/J9FHoorNsfoJr9/2SVqeSKLwPD9Nw==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.2.0: - resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} - hasBin: true - js-yaml@4.3.0: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true @@ -2555,6 +3514,13 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2622,6 +3588,14 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -2633,20 +3607,40 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + light-my-request@5.14.0: + resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@5.0.1: - resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + linkify-it@5.0.2: + resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} + locate-app@2.5.0: + resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -2671,9 +3665,18 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.pickby@4.6.0: + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} + lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.zip@4.2.0: + resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} + lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -2685,10 +3688,21 @@ packages: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} + loglevel-plugin-prefix@0.8.4: + resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + + loglevel@1.9.2: + resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} + engines: {node: '>= 0.6.0'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2703,12 +3717,19 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - markdown-it@14.2.0: - resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} + markdown-it@14.3.0: + resolution: {integrity: sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==} hasBin: true math-intrinsics@1.1.0: @@ -2734,6 +3755,10 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -2743,6 +3768,11 @@ packages: engines: {node: '>=4'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -2751,6 +3781,10 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -2758,6 +3792,10 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -2769,23 +3807,42 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} mnemonist@0.38.3: resolution: {integrity: sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==} + mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + mocha@11.7.6: resolution: {integrity: sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + modern-tar@0.7.6: + resolution: {integrity: sha512-sweCIVXzx1aIGTCdzcMlSZt1h8k5Tmk08VNAuRk3IU28XamGiOH5ypi11g6De2CH7PhYqSSnGy2A/EFhbWnVKg==} + engines: {node: '>=18.0.0'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + nanoid@3.3.15: resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2797,22 +3854,26 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + netmask@2.1.1: + resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} + engines: {node: '>= 0.4.0'} + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - node-abi@3.92.0: - resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==} + node-abi@3.94.0: + resolution: {integrity: sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==} engines: {node: '>=10'} node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} - node-releases@2.0.47: - resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + node-releases@2.0.50: + resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} engines: {node: '>=18'} node-sarif-builder@3.4.0: @@ -2826,11 +3887,27 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@7.0.1: + resolution: {integrity: sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA==} + engines: {node: ^18.17.0 || >=20.5.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + npm-run-all@4.1.5: resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} engines: {node: '>= 4'} hasBin: true + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -2869,6 +3946,13 @@ packages: obliterator@1.6.1: resolution: {integrity: sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==} + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2892,22 +3976,42 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@7.0.5: + resolution: {integrity: sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==} engines: {node: '>=18'} p-min-delay@4.2.0: resolution: {integrity: sha512-VMj+bb3VIP9W4S5YHHqKLJlJv8M+qsrvMpbvZB8mk/DNhBGJhFW1rKpF2t+9cRPUzriplRKecIbdWiWjpKaDCw==} engines: {node: '>=12'} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2926,10 +4030,18 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + parse-json@8.3.0: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-semver@1.1.1: resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} @@ -2946,6 +4058,14 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-expression-matcher@1.6.1: + resolution: {integrity: sha512-h7bxdzhHk8Knyc4Tj+jMaa7fEEoUJy7p1qtbVgkYg1Uhpe5Np5VuGXCRZnkZvU+Q42M1vStt0ifa3ueykRJPmQ==} + engines: {node: '>=14.0.0'} + path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} @@ -2954,6 +4074,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2977,6 +4101,12 @@ packages: resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} engines: {node: '>=18'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -2987,8 +4117,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pidtree@0.3.1: @@ -3000,6 +4130,16 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@9.14.0: + resolution: {integrity: sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==} + hasBin: true + pluralize@2.0.0: resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} @@ -3025,12 +4165,45 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + pretty-format@30.4.1: + resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} @@ -3042,13 +4215,23 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.15.2: - resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} + query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + rc-config-loader@4.1.4: resolution: {integrity: sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==} @@ -3064,6 +4247,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.2.7: resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} @@ -3094,10 +4280,18 @@ packages: resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} engines: {node: '>=0.10.0'} + read-pkg-up@10.1.0: + resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} + engines: {node: '>=16'} + read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} + read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} + engines: {node: '>=16'} + read-pkg@9.0.1: resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} engines: {node: '>=18'} @@ -3113,6 +4307,17 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -3121,6 +4326,14 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -3137,6 +4350,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3151,14 +4367,35 @@ packages: engines: {node: '>= 0.4'} hasBin: true + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + resq@1.11.0: + resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} + engines: {node: '>=10'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rgb2hex@0.2.5: + resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} + rollup@4.62.2: resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3168,9 +4405,20 @@ packages: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + run-async@4.0.6: + resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==} + engines: {node: '>=0.12.0'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safaridriver@1.0.1: + resolution: {integrity: sha512-jkg4434cYgtrIF2AeY/X0Wmd2W73cK5qIEFE3hDrrQenJH/2SDJIXGvPAigfvQTcE9+H31zkiNHbUqcihEiMRA==} + engines: {node: '>=18.0.0'} + safe-array-concat@1.1.4: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} @@ -3189,6 +4437,17 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + + safe-regex2@5.1.1: + resolution: {integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==} + hasBin: true + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3204,6 +4463,13 @@ packages: engines: {node: '>=20.0.0'} hasBin: true + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + seek-bzip@2.0.0: + resolution: {integrity: sha512-SMguiTnYrhpLdk3PwfzHeotrcwi8bNV4iemL9tx9poR/yeaMYwB9VzR1w7b57DuWpuqR8n6oZboi0hj3AxZxQg==} + hasBin: true + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -3212,20 +4478,22 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.8.4: - resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} - engines: {node: '>=10'} - hasBin: true - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true + serialize-error@12.0.0: + resolution: {integrity: sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==} + engines: {node: '>=18'} + serialize-javascript@7.0.7: resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} engines: {node: '>=20.0.0'} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3241,6 +4509,9 @@ packages: setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -3257,8 +4528,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.4: - resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} + shell-quote@1.9.0: + resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} engines: {node: '>= 0.4'} side-channel-list@1.0.1: @@ -3287,6 +4558,10 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} @@ -3295,6 +4570,29 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonic-boom@4.2.1: + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + + sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + + sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -3303,6 +4601,13 @@ packages: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spacetrim@0.11.59: + resolution: {integrity: sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -3315,6 +4620,18 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} @@ -3323,6 +4640,13 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + stream-buffers@3.0.3: + resolution: {integrity: sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==} + engines: {node: '>= 0.10.0'} + + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3369,6 +4693,13 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-dirs@3.0.0: + resolution: {integrity: sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ==} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -3377,6 +4708,13 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strnum@2.4.1: + resolution: {integrity: sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==} + + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + structured-source@4.0.0: resolution: {integrity: sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==} @@ -3415,13 +4753,22 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} + + tar-fs@3.1.3: + resolution: {integrity: sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + terminal-link@4.0.0: resolution: {integrity: sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==} engines: {node: '>=18'} @@ -3430,6 +4777,9 @@ packages: resolution: {integrity: sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==} engines: {node: 20 || >=22} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -3437,13 +4787,34 @@ packages: resolution: {integrity: sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==} engines: {node: '>=4'} + thread-stream@3.2.0: + resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinyclip@0.1.15: + resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==} + engines: {node: ^16.14.0 || >= 17.3.0} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + tmp@0.2.7: resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} engines: {node: '>=14.14'} @@ -3452,6 +4823,18 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toad-cache@3.7.4: + resolution: {integrity: sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==} + engines: {node: '>=20'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -3464,6 +4847,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.23.0: + resolution: {integrity: sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -3475,6 +4863,14 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-fest@4.26.0: + resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} + engines: {node: '>=16'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -3513,16 +4909,27 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@6.27.0: + resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} + engines: {node: '>=18.17'} + undici@7.28.0: resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} @@ -3551,11 +4958,18 @@ packages: url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + userhome@1.0.1: + resolution: {integrity: sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==} + engines: {node: '>= 0.8.0'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3614,6 +5028,39 @@ packages: yaml: optional: true + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + wait-port@1.1.0: + resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} + engines: {node: '>=10'} + hasBin: true + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + wdio-vscode-service@8.0.0: + resolution: {integrity: sha512-lIJrrdRereFekZfHxAj8aXd/dzyFiDMMFt+66muhn8IVq7Pqu25ufoVr26wjh7MRFSp4DJqvA1txspPMIDA6WQ==} + engines: {node: '>=18'} + peerDependencies: + webdriverio: ^9.0.0 + peerDependenciesMeta: + webdriverio: + optional: true + + webdriver@9.29.1: + resolution: {integrity: sha512-uhxYap3qQXC9H2V8SDr7vcy0blZETeri4goLwbw1TFq4EZHF1Dv503Zc0PAjfkNQJCD4/rzAyr07+EX72kx1pg==} + engines: {node: '>=18.20.0'} + + webdriverio@9.29.1: + resolution: {integrity: sha512-UIplAnvbjdE0tucHVR/8Uk0Y7rz72VaEx/s0Tq91fMdXm+m+Za16e+b5tObh4xEEfyCITODPfzgBva9rA+xApQ==} + engines: {node: '>=18.20.0'} + peerDependencies: + puppeteer-core: '>=22.x || <=24.x' + peerDependenciesMeta: + puppeteer-core: + optional: true + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -3648,13 +5095,25 @@ packages: engines: {node: '>= 8'} hasBin: true + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + workerpool@9.3.4: resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3670,10 +5129,26 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + 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 + wsl-utils@0.1.0: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + xml-naming@0.1.0: + resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} + engines: {node: '>=16.0.0'} + xml2js@0.5.0: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} @@ -3696,6 +5171,10 @@ packages: resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} engines: {node: '>= 6'} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -3708,6 +5187,10 @@ packages: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} + engines: {node: '>=10'} + yargs@17.7.3: resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} @@ -3716,6 +5199,9 @@ packages: resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@3.4.0: resolution: {integrity: sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==} engines: {node: '>=12'} @@ -3727,10 +5213,26 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + yoctodelay@2.0.0: resolution: {integrity: sha512-0m1YaiUEnEPrZ7mKxkfRpPLfOjG1GeWd2E2IfB8toIUEhXjk5cW+czBDiQQkkMDycsuGDkG1dP40QQQoKJmEWw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} @@ -3755,7 +5257,7 @@ snapshots: dependencies: '@aws-sdk/core': 3.974.27 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3764,9 +5266,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3776,9 +5278,9 @@ snapshots: '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/middleware-sdk-api-gateway': 3.972.21 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3787,9 +5289,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3798,9 +5300,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3809,9 +5311,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3822,9 +5324,9 @@ snapshots: '@aws-sdk/dynamodb-codec': 3.973.27 '@aws-sdk/middleware-endpoint-discovery': 3.972.22 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3833,9 +5335,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3845,9 +5347,9 @@ snapshots: '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/signature-v4-multi-region': 3.996.38 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3856,9 +5358,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3867,9 +5369,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3878,9 +5380,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3889,9 +5391,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3903,9 +5405,9 @@ snapshots: '@aws-sdk/middleware-sdk-s3': 3.972.58 '@aws-sdk/signature-v4-multi-region': 3.996.38 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3914,9 +5416,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3925,9 +5427,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3936,9 +5438,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3948,9 +5450,9 @@ snapshots: '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/middleware-sdk-sqs': 3.972.34 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3959,9 +5461,9 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3971,9 +5473,9 @@ snapshots: '@aws-sdk/credential-provider-node': 3.972.62 '@aws-sdk/signature-v4-multi-region': 3.996.38 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -3982,8 +5484,8 @@ snapshots: '@aws-sdk/types': 3.973.15 '@aws-sdk/xml-builder': 3.972.33 '@aws/lambda-invoke-store': 0.3.0 - '@smithy/core': 3.29.0 - '@smithy/signature-v4': 5.6.1 + '@smithy/core': 3.29.1 + '@smithy/signature-v4': 5.6.2 '@smithy/types': 4.15.1 bowser: 2.14.1 tslib: 2.8.1 @@ -3992,7 +5494,7 @@ snapshots: dependencies: '@aws-sdk/core': 3.974.27 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4000,9 +5502,9 @@ snapshots: dependencies: '@aws-sdk/core': 3.974.27 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4017,8 +5519,8 @@ snapshots: '@aws-sdk/credential-provider-web-identity': 3.972.59 '@aws-sdk/nested-clients': 3.997.27 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/credential-provider-imds': 4.4.5 + '@smithy/core': 3.29.1 + '@smithy/credential-provider-imds': 4.4.6 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4027,7 +5529,7 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/nested-clients': 3.997.27 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4040,8 +5542,8 @@ snapshots: '@aws-sdk/credential-provider-sso': 3.972.59 '@aws-sdk/credential-provider-web-identity': 3.972.59 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/credential-provider-imds': 4.4.5 + '@smithy/core': 3.29.1 + '@smithy/credential-provider-imds': 4.4.6 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4049,7 +5551,7 @@ snapshots: dependencies: '@aws-sdk/core': 3.974.27 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4059,7 +5561,7 @@ snapshots: '@aws-sdk/nested-clients': 3.997.27 '@aws-sdk/token-providers': 3.1079.0 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4068,14 +5570,14 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/nested-clients': 3.997.27 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 '@aws-sdk/dynamodb-codec@3.973.27': dependencies: '@aws-sdk/core': 3.974.27 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4088,14 +5590,14 @@ snapshots: dependencies: '@aws-sdk/endpoint-cache': 3.972.8 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 '@aws-sdk/middleware-sdk-api-gateway@3.972.21': dependencies: '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4104,14 +5606,14 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/signature-v4-multi-region': 3.996.38 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 '@aws-sdk/middleware-sdk-sqs@3.972.34': dependencies: '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4120,16 +5622,16 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/signature-v4-multi-region': 3.996.38 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 - '@smithy/fetch-http-handler': 5.6.2 - '@smithy/node-http-handler': 4.9.2 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 '@smithy/types': 4.15.1 tslib: 2.8.1 '@aws-sdk/signature-v4-multi-region@3.996.38': dependencies: '@aws-sdk/types': 3.973.15 - '@smithy/signature-v4': 5.6.1 + '@smithy/signature-v4': 5.6.2 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4138,7 +5640,7 @@ snapshots: '@aws-sdk/core': 3.974.27 '@aws-sdk/nested-clients': 3.997.27 '@aws-sdk/types': 3.973.15 - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -4217,8 +5719,8 @@ snapshots: '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 5.14.0 - '@azure/msal-node': 5.2.5 + '@azure/msal-browser': 5.16.0 + '@azure/msal-node': 5.3.1 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -4231,15 +5733,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-browser@5.14.0': + '@azure/msal-browser@5.16.0': dependencies: - '@azure/msal-common': 16.9.0 + '@azure/msal-common': 16.11.0 - '@azure/msal-common@16.9.0': {} + '@azure/msal-common@16.11.0': {} - '@azure/msal-node@5.2.5': + '@azure/msal-node@5.3.1': dependencies: - '@azure/msal-common': 16.9.0 + '@azure/msal-common': 16.11.0 jsonwebtoken: 9.0.3 '@babel/code-frame@7.29.7': @@ -4250,16 +5752,16 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7(supports-color@8.1.1)': + '@babel/core@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 @@ -4282,7 +5784,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 + browserslist: 4.28.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -4290,17 +5792,17 @@ snapshots: '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color @@ -4321,14 +5823,14 @@ snapshots: dependencies: '@babel/types': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/runtime@7.29.7': {} @@ -4339,7 +5841,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - '@babel/traverse@7.29.7(supports-color@8.1.1)': + '@babel/traverse@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -4393,6 +5895,8 @@ snapshots: '@biomejs/cli-win32-x64@2.5.2': optional: true + '@borewit/text-codec@0.2.2': {} + '@dagrejs/dagre@1.1.8': dependencies: '@dagrejs/graphlib': 2.2.4 @@ -4560,20 +6064,20 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(supports-color@8.1.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': dependencies: - eslint: 9.39.4(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.1.0(eslint@9.39.4(supports-color@8.1.1))': + '@eslint/compat@2.1.0(eslint@9.39.4(jiti@2.7.0))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: - eslint: 9.39.4(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) - '@eslint/config-array@0.21.2(supports-color@8.1.1)': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3(supports-color@8.1.1) @@ -4593,7 +6097,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5(supports-color@8.1.1)': + '@eslint/eslintrc@3.3.5': dependencies: ajv: 6.15.0 debug: 4.4.3(supports-color@8.1.1) @@ -4601,7 +6105,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.2.0 + js-yaml: 4.3.0 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -4616,6 +6120,46 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@fastify/accept-negotiator@1.1.0': {} + + '@fastify/ajv-compiler@3.6.0': + dependencies: + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + fast-uri: 3.1.3 + + '@fastify/cors@9.0.1': + dependencies: + fastify-plugin: 4.5.1 + mnemonist: 0.39.6 + + '@fastify/error@3.4.1': {} + + '@fastify/fast-json-stringify-compiler@4.3.0': + dependencies: + fast-json-stringify: 5.16.1 + + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + + '@fastify/send@2.1.0': + dependencies: + '@lukeed/ms': 2.0.2 + escape-html: 1.0.3 + fast-decode-uri-component: 1.0.1 + http-errors: 2.0.0 + mime: 3.0.0 + + '@fastify/static@7.0.4': + dependencies: + '@fastify/accept-negotiator': 1.1.0 + '@fastify/send': 2.1.0 + content-disposition: 0.5.4 + fastify-plugin: 4.5.1 + fastq: 1.20.1 + glob: 10.5.0 + '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -4632,6 +6176,131 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@20.19.43)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.19.43) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/confirm@5.1.21(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/type': 3.0.10(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/core@10.3.2(@types/node@20.19.43)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.19.43) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/editor@4.2.23(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/external-editor': 1.0.3(@types/node@20.19.43) + '@inquirer/type': 3.0.10(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/expand@4.0.23(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/type': 3.0.10(@types/node@20.19.43) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/external-editor@1.0.3(@types/node@20.19.43)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/type': 3.0.10(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/number@3.0.23(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/type': 3.0.10(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/password@4.0.23(@types/node@20.19.43)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/type': 3.0.10(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/prompts@7.10.1(@types/node@20.19.43)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@20.19.43) + '@inquirer/confirm': 5.1.21(@types/node@20.19.43) + '@inquirer/editor': 4.2.23(@types/node@20.19.43) + '@inquirer/expand': 4.0.23(@types/node@20.19.43) + '@inquirer/input': 4.3.1(@types/node@20.19.43) + '@inquirer/number': 3.0.23(@types/node@20.19.43) + '@inquirer/password': 4.0.23(@types/node@20.19.43) + '@inquirer/rawlist': 4.1.11(@types/node@20.19.43) + '@inquirer/search': 3.2.2(@types/node@20.19.43) + '@inquirer/select': 4.4.2(@types/node@20.19.43) + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/rawlist@4.1.11(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/type': 3.0.10(@types/node@20.19.43) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/search@3.2.2(@types/node@20.19.43)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.19.43) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/select@4.4.2(@types/node@20.19.43)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@20.19.43) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.43 + + '@inquirer/type@3.0.10(@types/node@20.19.43)': + optionalDependencies: + '@types/node': 20.19.43 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4643,6 +6312,33 @@ snapshots: '@istanbuljs/schema@0.1.6': {} + '@jest/diff-sequences@30.4.0': {} + + '@jest/expect-utils@30.4.1': + dependencies: + '@jest/get-type': 30.1.0 + + '@jest/get-type@30.1.0': {} + + '@jest/pattern@30.4.0': + dependencies: + '@types/node': 20.19.43 + jest-regex-util: 30.4.0 + + '@jest/schemas@30.4.1': + dependencies: + '@sinclair/typebox': 0.34.49 + + '@jest/types@30.4.1': + dependencies: + '@jest/pattern': 30.4.0 + '@jest/schemas': 30.4.1 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.19.43 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4662,7 +6358,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@localstack/appinspector-ui@1.0.158(09e585e523679aaf310539e99633db80)': + '@localstack/appinspector-ui@1.0.159(0b69306333cf32f83cd36f8060c1c18c)': dependencies: '@dagrejs/dagre': 1.1.8 '@emotion/react': 11.14.0(@types/react@17.0.93)(react@17.0.2) @@ -4671,7 +6367,7 @@ snapshots: '@mui/icons-material': 5.18.0(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@17.0.93)(react@17.0.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.93)(react@17.0.2))(@types/react@17.0.93)(react@17.0.2))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(@types/react@17.0.93)(react@17.0.2) '@mui/material': 5.18.0(@emotion/react@11.14.0(@types/react@17.0.93)(react@17.0.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.93)(react@17.0.2))(@types/react@17.0.93)(react@17.0.2))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@mui/styles': 5.18.0(@types/react@17.0.93)(react@17.0.2) - '@xyflow/react': 12.11.0(@types/react-dom@17.0.26(@types/react@17.0.93))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) + '@xyflow/react': 12.11.1(@types/react-dom@17.0.26(@types/react@17.0.93))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) react-router-dom: 6.30.4(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -4688,6 +6384,8 @@ snapshots: - '@types/react' - react-dom + '@lukeed/ms@2.0.2': {} + '@mui/core-downloads-tracker@5.18.0': {} '@mui/icons-material@5.18.0(@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@17.0.93)(react@17.0.2))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.93)(react@17.0.2))(@types/react@17.0.93)(react@17.0.2))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(@types/react@17.0.93)(react@17.0.2)': @@ -4795,6 +6493,8 @@ snapshots: optionalDependencies: '@types/react': 17.0.93 + '@nodable/entities@2.2.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4807,11 +6507,32 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@pinojs/redact@0.4.0': {} + '@pkgjs/parseargs@0.11.0': optional: true '@popperjs/core@2.11.8': {} + '@promptbook/utils@0.69.5': + dependencies: + spacetrim: 0.11.59 + + '@puppeteer/browsers@2.13.2': + dependencies: + debug: 4.4.3(supports-color@8.1.1) + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.8.5 + tar-fs: 3.1.3 + yargs: 17.7.3 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + '@remix-run/router@1.23.3': {} '@rolldown/pluginutils@1.0.0-rc.3': {} @@ -4893,6 +6614,8 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@sec-ant/readable-stream@0.4.1': {} + '@secretlint/config-creator@10.2.2': dependencies: '@secretlint/types': 10.2.2 @@ -4942,7 +6665,7 @@ snapshots: '@secretlint/source-creator': 10.2.2 '@secretlint/types': 10.2.2 debug: 4.4.3(supports-color@8.1.1) - p-map: 7.0.4 + p-map: 7.0.5 transitivePeerDependencies: - supports-color @@ -4967,34 +6690,40 @@ snapshots: '@secretlint/types@10.2.2': {} + '@sinclair/typebox@0.34.49': {} + + '@sindresorhus/is@5.6.0': {} + '@sindresorhus/merge-streams@2.3.0': {} - '@smithy/core@3.29.0': + '@sindresorhus/merge-streams@4.0.0': {} + + '@smithy/core@3.29.1': dependencies: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.4.5': + '@smithy/credential-provider-imds@4.4.6': dependencies: - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.6.2': + '@smithy/fetch-http-handler@5.6.3': dependencies: - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.9.2': + '@smithy/node-http-handler@4.9.3': dependencies: - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/signature-v4@5.6.1': + '@smithy/signature-v4@5.6.2': dependencies: - '@smithy/core': 3.29.0 + '@smithy/core': 3.29.1 '@smithy/types': 4.15.1 tslib: 2.8.1 @@ -5002,6 +6731,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + '@textlint/ast-node-types@15.7.1': {} '@textlint/linter-formatter@15.7.1': @@ -5031,6 +6764,18 @@ snapshots: dependencies: '@textlint/ast-node-types': 15.7.1 + '@tokenizer/inflate@0.2.7': + dependencies: + debug: 4.4.3(supports-color@8.1.1) + fflate: 0.8.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.7 @@ -5080,8 +6825,18 @@ snapshots: '@types/jsonfile': 6.1.4 '@types/node': 20.19.43 + '@types/http-cache-semantics@4.2.0': {} + '@types/istanbul-lib-coverage@2.0.6': {} + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -5122,17 +6877,38 @@ snapshots: '@types/scheduler@0.16.8': {} + '@types/sinonjs__fake-timers@8.1.5': {} + + '@types/stack-utils@2.0.3': {} + '@types/vscode@1.125.0': {} - '@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@types/which@2.0.2': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 20.19.43 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.19.43 + optional: true + + '@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/type-utils': 8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(supports-color@8.1.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.62.1 - eslint: 9.39.4(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -5140,14 +6916,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.62.1 '@typescript-eslint/types': 8.62.1 '@typescript-eslint/typescript-estree': 8.62.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.62.1 debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.4(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5170,13 +6946,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.62.1 '@typescript-eslint/typescript-estree': 8.62.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(supports-color@8.1.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.4(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -5199,13 +6975,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.62.1(eslint@9.39.4(supports-color@8.1.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(supports-color@8.1.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.62.1 '@typescript-eslint/types': 8.62.1 '@typescript-eslint/typescript-estree': 8.62.1(typescript@5.9.3) - eslint: 9.39.4(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5217,24 +6993,51 @@ snapshots: '@typespec/ts-http-runtime@0.3.6': dependencies: - http-proxy-agent: 7.0.2(supports-color@8.1.1) - https-proxy-agent: 7.0.6(supports-color@8.1.1) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.2.0(supports-color@8.1.1)(vite@7.3.6(@types/node@20.19.43))': + '@vitejs/plugin-react@5.2.0(vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.0))': dependencies: - '@babel/core': 7.29.7(supports-color@8.1.1) - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.6(@types/node@20.19.43) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.0) transitivePeerDependencies: - supports-color + '@vitest/pretty-format@2.1.9': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@4.1.9': + dependencies: + tinyrainbow: 3.1.0 + + '@vitest/snapshot@2.1.9': + dependencies: + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.21 + pathe: 1.1.2 + + '@vitest/snapshot@4.1.9': + dependencies: + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/utils@4.1.9': + dependencies: + '@vitest/pretty-format': 4.1.9 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + '@vscode/test-cli@0.0.15': dependencies: '@types/mocha': 10.0.10 @@ -5249,13 +7052,13 @@ snapshots: transitivePeerDependencies: - monocart-coverage-reports - '@vscode/test-electron@2.5.2(supports-color@8.1.1)': + '@vscode/test-electron@2.5.2': dependencies: - http-proxy-agent: 7.0.2(supports-color@8.1.1) - https-proxy-agent: 7.0.6(supports-color@8.1.1) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 jszip: 3.10.1 ora: 8.2.0 - semver: 7.8.4 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -5298,7 +7101,7 @@ snapshots: '@vscode/vsce-sign-win32-arm64': 2.0.6 '@vscode/vsce-sign-win32-x64': 2.0.6 - '@vscode/vsce@3.9.2(supports-color@8.1.1)': + '@vscode/vsce@3.9.2': dependencies: '@azure/identity': 4.13.1 '@secretlint/node': 10.2.2 @@ -5316,13 +7119,13 @@ snapshots: hosted-git-info: 4.1.0 jsonc-parser: 3.3.1 leven: 3.1.0 - markdown-it: 14.2.0 + markdown-it: 14.3.0 mime: 1.6.0 minimatch: 10.2.5 parse-semver: 1.1.1 read: 1.0.7 - secretlint: 10.2.2(supports-color@8.1.1) - semver: 7.8.4 + secretlint: 10.2.2 + semver: 7.8.5 tmp: 0.2.7 typed-rest-client: 1.8.11 url-join: 4.0.1 @@ -5334,9 +7137,265 @@ snapshots: transitivePeerDependencies: - supports-color - '@xyflow/react@12.11.0(@types/react-dom@17.0.26(@types/react@17.0.93))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + '@wdio/cli@9.29.1(@types/node@20.19.43)(expect-webdriverio@5.7.0)': + dependencies: + '@vitest/snapshot': 2.1.9 + '@wdio/config': 9.29.1 + '@wdio/globals': 9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.29.1) + '@wdio/logger': 9.29.1 + '@wdio/protocols': 9.29.1 + '@wdio/types': 9.29.1 + '@wdio/utils': 9.29.1 + async-exit-hook: 2.0.1 + chalk: 5.6.2 + chokidar: 4.0.3 + create-wdio: 9.29.1(@types/node@20.19.43) + dotenv: 17.4.2 + import-meta-resolve: 4.2.0 + lodash.flattendeep: 4.4.0 + lodash.pickby: 4.6.0 + lodash.union: 4.6.0 + read-pkg-up: 10.1.0 + tsx: 4.23.0 + webdriverio: 9.29.1 + yargs: 17.7.3 + transitivePeerDependencies: + - '@types/node' + - bare-abort-controller + - bare-buffer + - bufferutil + - expect-webdriverio + - puppeteer-core + - react-native-b4a + - supports-color + - utf-8-validate + + '@wdio/config@9.29.1': + dependencies: + '@wdio/logger': 9.29.1 + '@wdio/types': 9.29.1 + '@wdio/utils': 9.29.1 + deepmerge-ts: 7.1.5 + glob: 10.5.0 + import-meta-resolve: 4.2.0 + jiti: 2.7.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@wdio/dot-reporter@9.29.1': + dependencies: + '@wdio/reporter': 9.29.1 + '@wdio/types': 9.29.1 + chalk: 5.6.2 + + '@wdio/globals@9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.29.1)': + dependencies: + expect-webdriverio: 5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.29.1) + webdriverio: 9.29.1 + + '@wdio/local-runner@9.29.1(@wdio/globals@9.29.1)(webdriverio@9.29.1)': + dependencies: + '@types/node': 20.19.43 + '@wdio/logger': 9.29.1 + '@wdio/repl': 9.16.2 + '@wdio/runner': 9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.29.1) + '@wdio/types': 9.29.1 + '@wdio/xvfb': 9.29.1 + exit-hook: 4.0.0 + expect-webdriverio: 5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.29.1) + split2: 4.2.0 + stream-buffers: 3.0.3 + transitivePeerDependencies: + - '@wdio/globals' + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + - webdriverio + + '@wdio/logger@9.29.1': + dependencies: + chalk: 5.6.2 + loglevel: 1.9.2 + loglevel-plugin-prefix: 0.8.4 + safe-regex2: 5.1.1 + strip-ansi: 7.2.0 + + '@wdio/mocha-framework@9.29.1': + dependencies: + '@types/mocha': 10.0.10 + '@types/node': 20.19.43 + '@wdio/logger': 9.29.1 + '@wdio/types': 9.29.1 + '@wdio/utils': 9.29.1 + mocha: 10.8.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@wdio/protocols@9.29.1': {} + + '@wdio/repl@9.16.2': + dependencies: + '@types/node': 20.19.43 + + '@wdio/reporter@9.29.1': + dependencies: + '@types/node': 20.19.43 + '@wdio/logger': 9.29.1 + '@wdio/types': 9.29.1 + diff: 8.0.4 + object-inspect: 1.13.4 + + '@wdio/runner@9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.29.1)': + dependencies: + '@types/node': 20.19.43 + '@wdio/config': 9.29.1 + '@wdio/dot-reporter': 9.29.1 + '@wdio/globals': 9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.29.1) + '@wdio/logger': 9.29.1 + '@wdio/types': 9.29.1 + '@wdio/utils': 9.29.1 + deepmerge-ts: 7.1.5 + expect-webdriverio: 5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.29.1) + webdriver: 9.29.1 + webdriverio: 9.29.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + + '@wdio/spec-reporter@9.29.1': + dependencies: + '@wdio/reporter': 9.29.1 + '@wdio/types': 9.29.1 + chalk: 5.6.2 + easy-table: 1.2.0 + pretty-ms: 9.3.0 + + '@wdio/types@9.29.1': + dependencies: + '@types/node': 20.19.43 + + '@wdio/utils@9.29.1': + dependencies: + '@puppeteer/browsers': 2.13.2 + '@wdio/logger': 9.29.1 + '@wdio/types': 9.29.1 + decamelize: 6.0.1 + deepmerge-ts: 7.1.5 + edgedriver: 6.3.0 + geckodriver: 6.1.0 + get-port: 7.2.0 + import-meta-resolve: 4.2.0 + locate-app: 2.5.0 + mitt: 3.0.1 + safaridriver: 1.0.1 + split2: 4.2.0 + wait-port: 1.1.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@wdio/xvfb@9.29.1': + dependencies: + '@wdio/logger': 9.29.1 + + '@xhmikosr/archive-type@7.1.0': + dependencies: + file-type: 20.5.0 + transitivePeerDependencies: + - supports-color + + '@xhmikosr/decompress-tar@8.1.0': + dependencies: + file-type: 20.5.0 + is-stream: 2.0.1 + tar-stream: 3.2.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@xhmikosr/decompress-tarbz2@8.1.0': + dependencies: + '@xhmikosr/decompress-tar': 8.1.0 + file-type: 20.5.0 + is-stream: 2.0.1 + seek-bzip: 2.0.0 + unbzip2-stream: 1.4.3 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@xhmikosr/decompress-targz@8.1.0': + dependencies: + '@xhmikosr/decompress-tar': 8.1.0 + file-type: 20.5.0 + is-stream: 2.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@xhmikosr/decompress-unzip@7.1.0': + dependencies: + file-type: 20.5.0 + get-stream: 6.0.1 + yauzl: 3.4.0 + transitivePeerDependencies: + - supports-color + + '@xhmikosr/decompress@10.2.1': dependencies: - '@xyflow/system': 0.0.77 + '@xhmikosr/decompress-tar': 8.1.0 + '@xhmikosr/decompress-tarbz2': 8.1.0 + '@xhmikosr/decompress-targz': 8.1.0 + '@xhmikosr/decompress-unzip': 7.1.0 + graceful-fs: 4.2.11 + strip-dirs: 3.0.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@xhmikosr/downloader@15.2.0': + dependencies: + '@xhmikosr/archive-type': 7.1.0 + '@xhmikosr/decompress': 10.2.1 + content-disposition: 0.5.4 + defaults: 2.0.2 + ext-name: 5.0.0 + file-type: 20.5.0 + filenamify: 6.0.0 + get-stream: 6.0.1 + got: 13.0.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@xyflow/react@12.11.1(@types/react-dom@17.0.26(@types/react@17.0.93))(@types/react@17.0.93)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': + dependencies: + '@xyflow/system': 0.0.78 classcat: 5.0.5 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) @@ -5347,7 +7406,7 @@ snapshots: transitivePeerDependencies: - immer - '@xyflow/system@0.0.77': + '@xyflow/system@0.0.78': dependencies: '@types/d3-drag': 3.0.7 '@types/d3-interpolate': 3.0.4 @@ -5359,6 +7418,14 @@ snapshots: d3-selection: 3.0.0 d3-zoom: 3.0.0 + '@zip.js/zip.js@2.8.26': {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + abstract-logging@2.0.1: {} + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: acorn: 8.17.0 @@ -5367,6 +7434,14 @@ snapshots: agent-base@7.1.4: {} + ajv-formats@2.1.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 @@ -5377,10 +7452,12 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 + fast-uri: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-colors@4.1.3: {} + ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -5397,10 +7474,45 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + anynum@1.0.1: {} + + archiver-utils@5.0.2: + dependencies: + glob: 10.5.0 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.18.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.2.0 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + argparse@2.0.1: {} + aria-query@5.3.2: {} + array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -5451,21 +7563,38 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + astral-regex@2.0.0: {} + async-exit-hook@2.0.1: {} + async-function@1.0.0: {} + async@3.2.6: {} + asynckit@0.4.0: {} + atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 + avvio@8.4.0: + dependencies: + '@fastify/error': 3.4.1 + fastq: 1.20.1 + azure-devops-node-api@12.5.0: dependencies: tunnel: 0.0.6 typed-rest-client: 1.8.11 + b4a@1.8.1: {} + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.29.7 @@ -5476,10 +7605,46 @@ snapshots: balanced-match@4.0.4: {} - base64-js@1.5.1: - optional: true + bare-events@2.9.1: {} + + bare-fs@4.7.3: + dependencies: + bare-events: 2.9.1 + bare-path: 3.0.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.5 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-os@3.9.3: {} + + bare-path@3.0.1: + dependencies: + bare-os: 3.9.3 + + bare-stream@2.13.3(bare-events@2.9.1): + dependencies: + b4a: 1.8.1 + streamx: 2.28.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.5: + dependencies: + bare-path: 3.0.1 + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.10.42: {} - baseline-browser-mapping@2.10.38: {} + basic-ftp@5.3.1: {} + + binary-extensions@2.3.0: {} binaryextensions@6.11.0: dependencies: @@ -5517,23 +7682,29 @@ snapshots: browser-stdout@1.3.1: {} - browserslist@4.28.2: + browserslist@4.28.4: dependencies: - baseline-browser-mapping: 2.10.38 - caniuse-lite: 1.0.30001799 - electron-to-chromium: 1.5.375 - node-releases: 2.0.47 - update-browserslist-db: 1.2.3(browserslist@4.28.2) + baseline-browser-mapping: 2.10.42 + caniuse-lite: 1.0.30001800 + electron-to-chromium: 1.5.387 + node-releases: 2.0.50 + update-browserslist-db: 1.2.3(browserslist@4.28.4) buffer-crc32@0.2.13: {} + buffer-crc32@1.0.0: {} + buffer-equal-constant-time@1.0.1: {} buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - optional: true + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 bundle-name@4.1.0: dependencies: @@ -5553,6 +7724,18 @@ snapshots: yargs: 17.7.3 yargs-parser: 21.1.1 + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.2.0 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.1.1 + responselike: 3.0.0 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -5574,7 +7757,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001799: {} + caniuse-lite@1.0.30001800: {} chalk@2.4.2: dependencies: @@ -5589,6 +7772,8 @@ snapshots: chalk@5.6.2: {} + chardet@2.2.0: {} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 @@ -5612,6 +7797,18 @@ snapshots: undici: 7.28.0 whatwg-mimetype: 4.0.0 + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -5623,6 +7820,8 @@ snapshots: chownr@1.1.4: optional: true + ci-info@4.4.0: {} + classcat@5.0.5: {} cli-cursor@5.0.0: @@ -5631,6 +7830,14 @@ snapshots: cli-spinners@2.9.2: {} + cli-width@4.1.0: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -5643,6 +7850,9 @@ snapshots: strip-ansi: 7.2.0 wrap-ansi: 9.0.2 + clone@1.0.4: + optional: true + clsx@2.1.1: {} cockatiel@3.2.1: {} @@ -5665,12 +7875,32 @@ snapshots: commander@12.1.0: {} + commander@14.0.3: {} + + commander@6.2.1: {} + + commander@9.5.0: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + concat-map@0.0.1: {} + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} + cookie@0.7.2: {} + core-util-is@1.0.3: {} cosmiconfig@7.1.0: @@ -5681,6 +7911,31 @@ snapshots: path-type: 4.0.0 yaml: 1.10.3 + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + + create-wdio@9.29.1(@types/node@20.19.43): + dependencies: + chalk: 5.6.2 + commander: 14.0.3 + cross-spawn: 7.0.6 + ejs: 3.1.10 + execa: 9.6.1 + import-meta-resolve: 4.2.0 + inquirer: 12.11.1(@types/node@20.19.43) + normalize-package-data: 7.0.1 + read-pkg-up: 10.1.0 + recursive-readdir: 2.2.3 + semver: 7.8.5 + type-fest: 4.41.0 + yargs: 17.7.3 + transitivePeerDependencies: + - '@types/node' + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 @@ -5703,6 +7958,10 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 + css-shorthand-properties@1.1.2: {} + + css-value@0.0.1: {} + css-vendor@2.0.8: dependencies: '@babel/runtime': 7.29.7 @@ -5748,6 +8007,8 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) + data-uri-to-buffer@6.0.2: {} + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -5778,16 +8039,23 @@ snapshots: decamelize@4.0.0: {} + decamelize@6.0.0: {} + + decamelize@6.0.1: {} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - optional: true + + deep-eql@5.0.2: {} deep-extend@0.6.0: optional: true deep-is@0.1.4: {} + deepmerge-ts@7.1.5: {} + default-browser-id@5.0.1: {} default-browser@5.5.0: @@ -5795,6 +8063,15 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 + defaults@1.0.4: + dependencies: + clone: 1.0.4 + optional: true + + defaults@2.0.2: {} + + defer-to-connect@2.0.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -5809,11 +8086,21 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delayed-stream@1.0.0: {} + depd@2.0.0: {} + detect-libc@2.1.2: optional: true + diff@5.2.2: {} + diff@8.0.4: {} doctrine@2.1.0: @@ -5843,6 +8130,8 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dotenv@17.4.2: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5851,15 +8140,43 @@ snapshots: eastasianwidth@0.2.0: {} + easy-table@1.2.0: + dependencies: + ansi-regex: 5.0.1 + optionalDependencies: + wcwidth: 1.0.1 + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 + edge-paths@3.0.5: + dependencies: + '@types/which': 2.0.2 + which: 2.0.2 + + edgedriver@6.3.0: + dependencies: + '@wdio/logger': 9.29.1 + '@zip.js/zip.js': 2.8.26 + decamelize: 6.0.1 + edge-paths: 3.0.5 + fast-xml-parser: 5.9.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + which: 6.0.1 + transitivePeerDependencies: + - supports-color + editions@6.22.0: dependencies: version-range: 4.15.0 - electron-to-chromium@1.5.375: {} + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-to-chromium@1.5.387: {} emoji-regex@10.6.0: {} @@ -5875,7 +8192,6 @@ snapshots: end-of-stream@1.4.5: dependencies: once: 1.4.0 - optional: true enhanced-resolve@5.24.1: dependencies: @@ -5915,7 +8231,7 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.1 + es-to-primitive: 1.3.4 function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 @@ -5977,9 +8293,10 @@ snapshots: dependencies: hasown: 2.0.4 - es-to-primitive@1.3.1: + es-to-primitive@1.3.4: dependencies: es-abstract-get: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 @@ -6016,10 +8333,22 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 @@ -6028,17 +8357,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.13.0(@typescript-eslint/parser@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(supports-color@8.1.1)): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - eslint: 9.39.4(supports-color@8.1.1) + '@typescript-eslint/parser': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.39.4(supports-color@8.1.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -6047,9 +8376,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.4(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(supports-color@8.1.1)) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint@9.39.4(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -6061,7 +8390,7 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -6078,14 +8407,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(supports-color@8.1.1): + eslint@9.39.4(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(supports-color@8.1.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2(supports-color@8.1.1) + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5(supports-color@8.1.1) + '@eslint/eslintrc': 3.3.5 '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 @@ -6114,6 +8443,8 @@ snapshots: minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -6123,6 +8454,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 + esprima@4.0.1: {} + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -6135,11 +8468,84 @@ snapshots: esutils@2.0.3: {} + event-target-shim@5.0.1: {} + + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + + events@3.3.0: {} + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + exit-hook@4.0.0: {} + expand-template@2.0.3: optional: true + expect-webdriverio@5.7.0(@wdio/globals@9.29.1)(@wdio/logger@9.29.1)(webdriverio@9.29.1): + dependencies: + '@vitest/snapshot': 4.1.9 + '@wdio/globals': 9.29.1(expect-webdriverio@5.7.0)(webdriverio@9.29.1) + '@wdio/logger': 9.29.1 + deep-eql: 5.0.2 + expect: 30.4.1 + jest-matcher-utils: 30.4.1 + webdriverio: 9.29.1 + + expect@30.4.1: + dependencies: + '@jest/expect-utils': 30.4.1 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.4.1 + jest-message-util: 30.4.1 + jest-mock: 30.4.1 + jest-util: 30.4.1 + + ext-list@2.2.2: + dependencies: + mime-db: 1.54.0 + + ext-name@5.0.0: + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-content-type-parse@1.1.0: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6150,26 +8556,110 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-json-stringify@5.16.1: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + fast-deep-equal: 3.1.3 + fast-uri: 3.1.3 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + fast-levenshtein@2.0.6: {} - fast-uri@3.1.2: {} + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-uri@3.1.3: {} + + fast-xml-builder@1.2.1: + dependencies: + path-expression-matcher: 1.6.1 + xml-naming: 0.1.0 + + fast-xml-parser@5.9.3: + dependencies: + '@nodable/entities': 2.2.0 + fast-xml-builder: 1.2.1 + is-unsafe: 1.0.1 + path-expression-matcher: 1.6.1 + strnum: 2.4.1 + xml-naming: 0.1.0 + + fastify-plugin@4.5.1: {} + + fastify@4.29.1: + dependencies: + '@fastify/ajv-compiler': 3.6.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.4.0 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.16.1 + find-my-way: 8.2.2 + light-my-request: 5.14.0 + pino: 9.14.0 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + semver: 7.8.5 + toad-cache: 3.7.4 fastq@1.20.1: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.4): + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 + + fflate@0.8.3: {} + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 + file-type@20.5.0: + dependencies: + '@tokenizer/inflate': 0.2.7 + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + + filelist@1.0.6: + dependencies: + minimatch: 5.1.9 + + filename-reserved-regex@3.0.0: {} + + filenamify@6.0.0: + dependencies: + filename-reserved-regex: 3.0.0 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + find-my-way@8.2.2: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 3.1.0 + find-root@1.1.0: {} find-up@5.0.0: @@ -6177,6 +8667,11 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + flat-cache@4.0.1: dependencies: flatted: 3.4.2 @@ -6195,6 +8690,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data-encoder@2.1.4: {} + form-data@4.0.6: dependencies: asynckit: 0.4.0 @@ -6203,6 +8700,8 @@ snapshots: hasown: 2.0.4 mime-types: 2.1.35 + forwarded@0.2.0: {} + fs-constants@1.0.0: optional: true @@ -6212,6 +8711,8 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true @@ -6231,6 +8732,17 @@ snapshots: functions-have-names@1.2.3: {} + geckodriver@6.1.0: + dependencies: + '@wdio/logger': 9.29.1 + '@zip.js/zip.js': 2.8.26 + decamelize: 6.0.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + modern-tar: 0.7.6 + transitivePeerDependencies: + - supports-color + generator-function@2.0.1: {} gensync@1.0.0-beta.2: {} @@ -6252,17 +8764,40 @@ snapshots: hasown: 2.0.4 math-intrinsics: 1.1.0 + get-port@7.1.0: {} + + get-port@7.2.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-uri@6.0.5: + dependencies: + basic-ftp: 5.3.1 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + github-from-package@0.0.0: optional: true @@ -6289,6 +8824,14 @@ snapshots: minipass: 7.1.3 path-scurry: 2.0.2 + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.9 + once: 1.4.0 + globals@14.0.0: {} globalthis@1.0.4: @@ -6307,8 +8850,24 @@ snapshots: gopd@1.2.0: {} + got@13.0.0: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + graceful-fs@4.2.11: {} + grapheme-splitter@1.0.4: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -6349,8 +8908,16 @@ snapshots: dependencies: lru-cache: 10.4.3 + hosted-git-info@8.1.0: + dependencies: + lru-cache: 10.4.3 + + hpagent@1.2.0: {} + html-escaper@2.0.2: {} + htmlfy@0.8.1: {} + htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 @@ -6358,28 +8925,48 @@ snapshots: domutils: 3.2.2 entities: 7.0.1 - http-proxy-agent@7.0.2(supports-color@8.1.1): + http-cache-semantics@4.2.0: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.6(supports-color@8.1.1): + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color + human-signals@8.0.1: {} + hyphenate-style-name@1.1.0: {} iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: - optional: true + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -6392,21 +8979,48 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} index-to-position@1.2.0: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} ini@1.3.8: optional: true + inquirer@12.11.1(@types/node@20.19.43): + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@20.19.43) + '@inquirer/prompts': 7.10.1(@types/node@20.19.43) + '@inquirer/type': 3.0.10(@types/node@20.19.43) + mute-stream: 2.0.0 + run-async: 4.0.6 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 20.19.43 + + inspect-with-kind@1.0.5: + dependencies: + kind-of: 6.0.3 + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.4 side-channel: 1.1.1 + ip-address@10.2.0: {} + + ipaddr.js@1.9.1: {} + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.9 @@ -6427,6 +9041,10 @@ snapshots: dependencies: has-bigints: 1.1.0 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -6496,8 +9114,12 @@ snapshots: is-path-inside@3.0.3: {} + is-plain-obj@1.1.0: {} + is-plain-obj@2.1.0: {} + is-plain-obj@4.1.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -6511,6 +9133,10 @@ snapshots: dependencies: call-bound: 1.0.4 + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -6532,6 +9158,8 @@ snapshots: is-unicode-supported@2.1.0: {} + is-unsafe@1.0.1: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -6553,6 +9181,8 @@ snapshots: isexe@2.0.0: {} + isexe@4.0.0: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -6578,13 +9208,61 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - js-ini@1.6.0: {} + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 - js-tokens@4.0.0: {} + jest-diff@30.4.1: + dependencies: + '@jest/diff-sequences': 30.4.0 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.4.1 - js-yaml@4.2.0: + jest-matcher-utils@30.4.1: dependencies: - argparse: 2.0.1 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.4.1 + pretty-format: 30.4.1 + + jest-message-util@30.4.1: + dependencies: + '@babel/code-frame': 7.29.7 + '@jest/types': 30.4.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-util: 30.4.1 + picomatch: 4.0.5 + pretty-format: 30.4.1 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@30.4.1: + dependencies: + '@jest/types': 30.4.1 + '@types/node': 20.19.43 + jest-util: 30.4.1 + + jest-regex-util@30.4.0: {} + + jest-util@30.4.1: + dependencies: + '@jest/types': 30.4.1 + '@types/node': 20.19.43 + chalk: 4.1.2 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.5 + + jiti@2.7.0: {} + + js-ini@1.6.0: {} + + js-tokens@4.0.0: {} js-yaml@4.3.0: dependencies: @@ -6598,6 +9276,12 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} + + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -6629,7 +9313,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.8.4 + semver: 7.8.5 jss-plugin-camel-case@10.10.0: dependencies: @@ -6705,6 +9389,12 @@ snapshots: dependencies: json-buffer: 3.0.1 + kind-of@6.0.3: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + leven@3.1.0: {} levn@0.4.1: @@ -6716,9 +9406,17 @@ snapshots: dependencies: immediate: 3.0.6 + light-my-request@5.14.0: + dependencies: + cookie: 0.7.2 + process-warning: 3.0.0 + set-cookie-parser: 2.7.2 + lines-and-columns@1.2.4: {} - linkify-it@5.0.1: + lines-and-columns@2.0.4: {} + + linkify-it@5.0.2: dependencies: uc.micro: 2.1.0 @@ -6729,10 +9427,24 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 + locate-app@2.5.0: + dependencies: + '@promptbook/utils': 0.69.5 + type-fest: 4.26.0 + userhome: 1.0.1 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.clonedeep@4.5.0: {} + + lodash.flattendeep@4.4.0: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -6749,8 +9461,14 @@ snapshots: lodash.once@4.1.1: {} + lodash.pickby@4.6.0: {} + lodash.truncate@4.4.2: {} + lodash.union@4.6.0: {} + + lodash.zip@4.2.0: {} + lodash@4.18.1: {} log-symbols@4.1.0: @@ -6763,10 +9481,16 @@ snapshots: chalk: 5.6.2 is-unicode-supported: 1.3.0 + loglevel-plugin-prefix@0.8.4: {} + + loglevel@1.9.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 + lowercase-keys@3.0.0: {} + lru-cache@10.4.3: {} lru-cache@11.5.1: {} @@ -6779,15 +9503,21 @@ snapshots: dependencies: yallist: 4.0.0 + lru-cache@7.18.3: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@4.0.0: dependencies: semver: 7.8.5 - markdown-it@14.2.0: + markdown-it@14.3.0: dependencies: argparse: 2.0.1 entities: 4.5.0 - linkify-it: 5.0.1 + linkify-it: 5.0.2 mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 @@ -6807,16 +9537,21 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 mime@1.6.0: {} + mime@3.0.0: {} + mimic-function@5.0.1: {} - mimic-response@3.1.0: - optional: true + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} minimatch@10.2.5: dependencies: @@ -6826,6 +9561,10 @@ snapshots: dependencies: brace-expansion: 1.1.15 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.1 + minimatch@9.0.9: dependencies: brace-expansion: 2.1.1 @@ -6834,6 +9573,8 @@ snapshots: minipass@7.1.3: {} + mitt@3.0.1: {} + mkdirp-classic@0.5.3: optional: true @@ -6841,6 +9582,33 @@ snapshots: dependencies: obliterator: 1.6.1 + mnemonist@0.39.6: + dependencies: + obliterator: 2.0.5 + + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.3(supports-color@8.1.1) + diff: 5.2.2 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.3.0 + log-symbols: 4.1.0 + minimatch: 5.1.9 + ms: 2.1.3 + serialize-javascript: 7.0.7 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.2 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + mocha@11.7.6: dependencies: browser-stdout: 1.3.1 @@ -6865,10 +9633,14 @@ snapshots: yargs-parser: 21.1.1 yargs-unparser: 2.0.0 + modern-tar@0.7.6: {} + ms@2.1.3: {} mute-stream@0.0.8: {} + mute-stream@2.0.0: {} + nanoid@3.3.15: {} napi-build-utils@2.0.0: @@ -6876,24 +9648,26 @@ snapshots: natural-compare@1.4.0: {} + netmask@2.1.1: {} + nice-try@1.0.5: {} - node-abi@3.92.0: + node-abi@3.94.0: dependencies: - semver: 7.8.4 + semver: 7.8.5 optional: true node-addon-api@4.3.0: optional: true - node-exports-info@1.6.0: + node-exports-info@1.6.2: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 object.entries: 1.1.9 semver: 6.3.1 - node-releases@2.0.47: {} + node-releases@2.0.50: {} node-sarif-builder@3.4.0: dependencies: @@ -6910,9 +9684,19 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.8.4 + semver: 7.8.5 + validate-npm-package-license: 3.0.4 + + normalize-package-data@7.0.1: + dependencies: + hosted-git-info: 8.1.0 + semver: 7.8.5 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + + normalize-url@8.1.1: {} + npm-run-all@4.1.5: dependencies: ansi-styles: 3.2.1 @@ -6922,9 +9706,14 @@ snapshots: minimatch: 3.1.5 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.8.4 + shell-quote: 1.9.0 string.prototype.padend: 3.1.6 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -6973,10 +9762,13 @@ snapshots: obliterator@1.6.1: {} + obliterator@2.0.5: {} + + on-exit-leak-free@2.1.2: {} + once@1.4.0: dependencies: wrappy: 1.0.2 - optional: true onetime@7.0.0: dependencies: @@ -7016,20 +9808,48 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-cancelable@3.0.0: {} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-map@7.0.4: {} + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@7.0.5: {} p-min-delay@4.2.0: dependencies: yoctodelay: 2.0.0 + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.1.1 + package-json-from-dist@1.0.1: {} pako@1.0.11: {} @@ -7050,12 +9870,22 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-json@7.1.1: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 + parse-json@8.3.0: dependencies: '@babel/code-frame': 7.29.7 index-to-position: 1.2.0 type-fest: 4.41.0 + parse-ms@4.0.0: {} + parse-semver@1.1.1: dependencies: semver: 5.7.2 @@ -7075,10 +9905,16 @@ snapshots: path-exists@4.0.0: {} + path-exists@5.0.0: {} + + path-expression-matcher@1.6.1: {} + path-key@2.0.1: {} path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: @@ -7099,18 +9935,42 @@ snapshots: path-type@6.0.0: {} + pathe@1.1.2: {} + + pathe@2.0.3: {} + pend@1.2.0: {} picocolors@1.1.1: {} picomatch@2.3.2: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pidtree@0.3.1: {} pify@3.0.0: {} + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.1.0: {} + + pino@9.14.0: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.1 + thread-stream: 3.2.0 + pluralize@2.0.0: {} pluralize@8.0.0: {} @@ -7131,40 +9991,85 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.92.0 + node-abi: 3.94.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.4 + tar-fs: 2.1.5 tunnel-agent: 0.6.0 optional: true prelude-ls@1.2.1: {} + pretty-format@30.4.1: + dependencies: + '@jest/schemas': 30.4.1 + ansi-styles: 5.2.0 + react-is-18: react-is@18.3.1 + react-is-19: react-is@19.2.7 + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} + process-warning@3.0.0: {} + + process-warning@5.0.0: {} + + process@0.11.10: {} + + progress@2.0.3: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 - optional: true punycode.js@2.3.1: {} punycode@2.3.1: {} - qs@6.15.2: + qs@6.15.3: dependencies: + es-define-property: 1.0.1 side-channel: 1.1.1 + query-selector-shadow-dom@1.0.1: {} + queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + + quick-lru@5.1.1: {} + rc-config-loader@4.1.4: dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -7191,6 +10096,8 @@ snapshots: react-is@16.13.1: {} + react-is@18.3.1: {} + react-is@19.2.7: {} react-refresh@0.18.0: {} @@ -7221,12 +10128,25 @@ snapshots: loose-envify: 1.4.0 object-assign: 4.1.1 + read-pkg-up@10.1.0: + dependencies: + find-up: 6.3.0 + read-pkg: 8.1.0 + type-fest: 4.41.0 + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 + read-pkg@8.1.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 7.1.1 + type-fest: 4.41.0 + read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 @@ -7256,10 +10176,32 @@ snapshots: util-deprecate: 1.0.2 optional: true + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + readdirp@4.1.2: {} readdirp@5.0.0: {} + real-require@0.2.0: {} + + recursive-readdir@2.2.3: + dependencies: + minimatch: 3.1.5 + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.9 @@ -7284,6 +10226,8 @@ snapshots: require-from-string@2.0.2: {} + resolve-alpn@1.2.1: {} + resolve-from@4.0.0: {} resolve@1.22.12: @@ -7297,18 +10241,34 @@ snapshots: dependencies: es-errors: 1.3.0 is-core-module: 2.16.2 - node-exports-info: 1.6.0 + node-exports-info: 1.6.2 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + resq@1.11.0: + dependencies: + fast-deep-equal: 2.0.1 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 signal-exit: 4.1.0 + ret@0.4.3: {} + + ret@0.5.0: {} + reusify@1.1.0: {} + rfdc@1.4.1: {} + + rgb2hex@0.2.5: {} + rollup@4.62.2: dependencies: '@types/estree': 1.0.9 @@ -7342,10 +10302,18 @@ snapshots: run-applescript@7.1.0: {} + run-async@4.0.6: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safaridriver@1.0.1: {} + safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 @@ -7369,6 +10337,16 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-regex2@3.1.0: + dependencies: + ret: 0.4.3 + + safe-regex2@5.1.1: + dependencies: + ret: 0.5.0 + + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} sax@1.6.0: {} @@ -7378,7 +10356,7 @@ snapshots: loose-envify: 1.4.0 object-assign: 4.1.1 - secretlint@10.2.2(supports-color@8.1.1): + secretlint@10.2.2: dependencies: '@secretlint/config-creator': 10.2.2 '@secretlint/formatter': 10.2.2 @@ -7390,16 +10368,26 @@ snapshots: transitivePeerDependencies: - supports-color + secure-json-parse@2.7.0: {} + + seek-bzip@2.0.0: + dependencies: + commander: 6.2.1 + semver@5.7.2: {} semver@6.3.1: {} - semver@7.8.4: {} - semver@7.8.5: {} + serialize-error@12.0.0: + dependencies: + type-fest: 4.41.0 + serialize-javascript@7.0.7: {} + set-cookie-parser@2.7.2: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -7424,6 +10412,8 @@ snapshots: setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -7436,7 +10426,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.4: {} + shell-quote@1.9.0: {} side-channel-list@1.0.1: dependencies: @@ -7478,6 +10468,8 @@ snapshots: simple-concat: 1.0.1 optional: true + slash@3.0.0: {} + slash@5.1.0: {} slice-ansi@4.0.0: @@ -7486,10 +10478,42 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + socks: 2.8.9 + transitivePeerDependencies: + - supports-color + + socks@2.8.9: + dependencies: + ip-address: 10.2.0 + smart-buffer: 4.2.0 + + sonic-boom@4.2.1: + dependencies: + atomic-sleep: 1.0.0 + + sort-keys-length@1.0.1: + dependencies: + sort-keys: 1.1.2 + + sort-keys@1.1.2: + dependencies: + is-plain-obj: 1.1.0 + source-map-js@1.2.1: {} source-map@0.5.7: {} + source-map@0.6.1: + optional: true + + spacetrim@0.11.59: {} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -7504,6 +10528,14 @@ snapshots: spdx-license-ids@3.0.23: {} + split2@4.2.0: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + statuses@2.0.1: {} + stdin-discarder@0.2.2: {} stop-iteration-iterator@1.1.0: @@ -7511,6 +10543,17 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + stream-buffers@3.0.3: {} + + streamx@2.28.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -7567,7 +10610,6 @@ snapshots: string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - optional: true strip-ansi@6.0.1: dependencies: @@ -7579,11 +10621,26 @@ snapshots: strip-bom@3.0.0: {} + strip-dirs@3.0.0: + dependencies: + inspect-with-kind: 1.0.5 + is-plain-obj: 1.1.0 + + strip-final-newline@4.0.0: {} + strip-json-comments@2.0.1: optional: true strip-json-comments@3.1.1: {} + strnum@2.4.1: + dependencies: + anynum: 1.0.1 + + strtok3@10.3.5: + dependencies: + '@tokenizer/token': 0.3.0 + structured-source@4.0.0: dependencies: boundary: 2.0.0 @@ -7621,7 +10678,7 @@ snapshots: tapable@2.3.3: {} - tar-fs@2.1.4: + tar-fs@2.1.5: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -7629,6 +10686,18 @@ snapshots: tar-stream: 2.2.0 optional: true + tar-fs@3.1.3: + dependencies: + pump: 3.0.4 + tar-stream: 3.2.0 + optionalDependencies: + bare-fs: 4.7.3 + bare-path: 3.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -7638,6 +10707,24 @@ snapshots: readable-stream: 3.6.2 optional: true + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.3 + fast-fifo: 1.3.2 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + terminal-link@4.0.0: dependencies: ansi-escapes: 7.3.0 @@ -7649,18 +10736,40 @@ snapshots: glob: 13.0.6 minimatch: 10.2.5 + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + text-table@0.2.0: {} textextensions@6.11.0: dependencies: editions: 6.22.0 + thread-stream@3.2.0: + dependencies: + real-require: 0.2.0 + + through@2.3.8: {} + tiny-warning@1.0.3: {} + tinyclip@0.1.15: {} + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tinyrainbow@1.2.0: {} + + tinyrainbow@3.1.0: {} + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.7 tmp@0.2.7: {} @@ -7668,6 +10777,16 @@ snapshots: dependencies: is-number: 7.0.0 + toad-cache@3.7.4: {} + + toidentifier@1.0.1: {} + + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -7681,6 +10800,12 @@ snapshots: tslib@2.8.1: {} + tsx@4.23.0: + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -7692,6 +10817,10 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@3.13.1: {} + + type-fest@4.26.0: {} + type-fest@4.41.0: {} typed-array-buffer@1.0.3: @@ -7729,17 +10858,17 @@ snapshots: typed-rest-client@1.8.11: dependencies: - qs: 6.15.2 + qs: 6.15.3 tunnel: 0.0.6 underscore: 1.13.8 - typescript-eslint@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3): + typescript-eslint@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.62.1(@typescript-eslint/parser@8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.62.1(eslint@9.39.4(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.62.1(@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.62.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(supports-color@8.1.1))(typescript@5.9.3) - eslint: 9.39.4(supports-color@8.1.1) + '@typescript-eslint/utils': 8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7748,6 +10877,8 @@ snapshots: uc.micro@2.1.0: {} + uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -7755,10 +10886,17 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + underscore@1.13.8: {} undici-types@6.21.0: {} + undici@6.27.0: {} + undici@7.28.0: {} unicorn-magic@0.1.0: {} @@ -7767,9 +10905,9 @@ snapshots: universalify@2.0.1: {} - update-browserslist-db@1.2.3(browserslist@4.28.2): + update-browserslist-db@1.2.3(browserslist@4.28.4): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -7779,10 +10917,14 @@ snapshots: url-join@4.0.1: {} + urlpattern-polyfill@10.1.0: {} + use-sync-external-store@1.6.0(react@17.0.2): dependencies: react: 17.0.2 + userhome@1.0.1: {} + util-deprecate@1.0.2: {} uuid@14.0.1: {} @@ -7800,17 +10942,120 @@ snapshots: version-range@4.15.0: {} - vite@7.3.6(@types/node@20.19.43): + vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.0): dependencies: esbuild: 0.28.1 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.16 rollup: 4.62.2 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 20.19.43 fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.23.0 + + vscode-uri@3.1.0: {} + + wait-port@1.1.0: + dependencies: + chalk: 4.1.2 + commander: 9.5.0 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + optional: true + + wdio-vscode-service@8.0.0(webdriverio@9.29.1): + dependencies: + '@fastify/cors': 9.0.1 + '@fastify/static': 7.0.4 + '@types/ws': 8.18.1 + '@vscode/test-electron': 2.5.2 + '@wdio/logger': 9.29.1 + '@xhmikosr/downloader': 15.2.0 + decamelize: 6.0.0 + fastify: 4.29.1 + get-port: 7.1.0 + hpagent: 1.2.0 + semver: 7.8.5 + slash: 5.1.0 + tinyclip: 0.1.15 + tmp-promise: 3.0.3 + undici: 6.27.0 + vscode-uri: 3.1.0 + ws: 8.21.0 + yargs-parser: 21.1.1 + optionalDependencies: + webdriverio: 9.29.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + + webdriver@9.29.1: + dependencies: + '@types/node': 20.19.43 + '@types/ws': 8.18.1 + '@wdio/config': 9.29.1 + '@wdio/logger': 9.29.1 + '@wdio/protocols': 9.29.1 + '@wdio/types': 9.29.1 + '@wdio/utils': 9.29.1 + deepmerge-ts: 7.1.5 + https-proxy-agent: 7.0.6 + undici: 6.27.0 + ws: 8.21.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + + webdriverio@9.29.1: + dependencies: + '@types/node': 20.19.43 + '@types/sinonjs__fake-timers': 8.1.5 + '@wdio/config': 9.29.1 + '@wdio/logger': 9.29.1 + '@wdio/protocols': 9.29.1 + '@wdio/repl': 9.16.2 + '@wdio/types': 9.29.1 + '@wdio/utils': 9.29.1 + archiver: 7.0.1 + aria-query: 5.3.2 + cheerio: 1.2.0 + css-shorthand-properties: 1.1.2 + css-value: 0.0.1 + grapheme-splitter: 1.0.4 + htmlfy: 0.8.1 + is-plain-obj: 4.1.0 + jszip: 3.10.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.1.0 + webdriver: 9.29.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate whatwg-encoding@3.1.1: dependencies: @@ -7867,10 +11112,22 @@ snapshots: dependencies: isexe: 2.0.0 + which@6.0.1: + dependencies: + isexe: 4.0.0 + word-wrap@1.2.5: {} + workerpool@6.5.1: {} + workerpool@9.3.4: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -7889,13 +11146,16 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 - wrappy@1.0.2: - optional: true + wrappy@1.0.2: {} + + ws@8.21.0: {} wsl-utils@0.1.0: dependencies: is-wsl: 3.1.1 + xml-naming@0.1.0: {} + xml2js@0.5.0: dependencies: sax: 1.6.0 @@ -7911,6 +11171,8 @@ snapshots: yaml@1.10.3: {} + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} yargs-parser@22.0.0: {} @@ -7922,6 +11184,16 @@ snapshots: flat: 5.0.2 is-plain-obj: 2.1.0 + yargs@16.2.2: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.3: dependencies: cliui: 8.0.1 @@ -7941,6 +11213,11 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yauzl@3.4.0: dependencies: pend: 1.2.0 @@ -7951,8 +11228,20 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.2: {} + + yoctocolors-cjs@2.1.3: {} + + yoctocolors@2.1.2: {} + yoctodelay@2.0.0: {} + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + zod@4.4.3: {} zustand@4.5.7(@types/react@17.0.93)(react@17.0.2): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f4938e5..28c3320 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,11 +10,32 @@ trustPolicyExclude: - semver@5.7.2 - semver@6.3.1 - undici-types@6.21.0 + # @wdio/repl@9.16.2 is signed with a different npm key than 9.0.8/9.4.4, + # which pnpm's trust-downgrade check flags as a possible takeover. Verified + # directly against the npm registry: every other wdio-org package we depend + # on (@wdio/cli, @wdio/local-runner, @wdio/mocha-framework, + # @wdio/spec-reporter, webdriverio) shows the *identical* keyid transition + # at the *same* 9.4.x/9.15.x → 9.16.x version boundary — a coordinated, + # org-wide publishing-pipeline change (e.g. a rotated npm automation token), + # not an isolated compromise of this one package. Excluded so pnpm installs + # the version our other wdio deps already require naturally, with no + # separate `overrides` pin needed. + - "@wdio/repl@9.16.2" + # pino@9.14.0 is signed with npm's current registry key (the one active + # since the old key expired 2025-01-29, per registry.npmjs.org/-/npm/v1/keys) + # — same registry-wide rotation as @wdio/repl above, not specific to pino. + - pino@9.14.0 blockExoticSubdeps: true allowBuilds: '@vscode/vsce-sign': true esbuild: true + # Pulled in transitively for multi-browser support we don't use (our + # capabilities only configure browserName: "vscode") — no need to run + # their postinstall scripts, which would otherwise download the Edge/ + # Firefox WebDriver binaries. + edgedriver: false + geckodriver: false keytar: true overrides: diff --git a/test/e2e/fixtures/terraform/small-serverless/main.tf b/test/e2e/fixtures/terraform/small-serverless/main.tf new file mode 100644 index 0000000..19cc4e5 --- /dev/null +++ b/test/e2e/fixtures/terraform/small-serverless/main.tf @@ -0,0 +1,123 @@ +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.0" + } + archive = { + source = "hashicorp/archive" + version = "~> 2.0" + } + } +} + +# Plain AWS provider config: `lstk tf` transparently redirects this at the +# LocalStack emulator, so no endpoint overrides are needed here. +provider "aws" { + region = "us-east-1" +} + +# Lambda's deployment package, generated at apply time from inline source — +# no separate handler file and nothing binary checked into the repo. +data "archive_file" "lambda" { + type = "zip" + output_path = "${path.module}/lambda_function.zip" + + source { + filename = "index.py" + content = <<EOF +def handler(event, context): + print("wdio e2e demo function invoked") + return {"statusCode": 200, "body": "ok"} +EOF + } +} + +resource "aws_s3_bucket" "app" { + bucket = "wdio-e2e-test-bucket" +} + +resource "aws_sqs_queue" "app" { + name = "wdio-e2e-test-queue" + visibility_timeout_seconds = 60 + message_retention_seconds = 1209600 + delay_seconds = 5 +} + +resource "aws_sns_topic" "app" { + name = "wdio-e2e-test-topic" + display_name = "WDIO E2E Test Topic" +} + +# Grants the topic permission to deliver to the queue — required for a real +# SNS-to-SQS subscription to confirm. +resource "aws_sqs_queue_policy" "app" { + queue_url = aws_sqs_queue.app.url + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Sid = "AllowSNSPublish" + Effect = "Allow" + Principal = { Service = "sns.amazonaws.com" } + Action = "sqs:SendMessage" + Resource = aws_sqs_queue.app.arn + Condition = { + ArnEquals = { + "aws:SourceArn" = aws_sns_topic.app.arn + } + } + } + ] + }) +} + +resource "aws_sns_topic_subscription" "app" { + topic_arn = aws_sns_topic.app.arn + protocol = "sqs" + endpoint = aws_sqs_queue.app.arn + + depends_on = [aws_sqs_queue_policy.app] +} + +resource "aws_iam_role" "app_function" { + name = "wdio-e2e-test-function-role" + path = "/service-role/" + description = "Execution role for the WebdriverIO e2e demo Lambda function" + max_session_duration = 7200 + + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { Service = "lambda.amazonaws.com" } + Action = "sts:AssumeRole" + } + ] + }) +} + +resource "aws_lambda_function" "app" { + function_name = "wdio-e2e-test-function" + role = aws_iam_role.app_function.arn + handler = "index.handler" + runtime = "python3.12" + filename = data.archive_file.lambda.output_path + source_code_hash = data.archive_file.lambda.output_base64sha256 + description = "WebdriverIO e2e demo function" + memory_size = 256 + timeout = 30 + + environment { + variables = { + BUCKET_NAME = aws_s3_bucket.app.bucket + } + } +} + +resource "aws_lambda_event_source_mapping" "app" { + event_source_arn = aws_sqs_queue.app.arn + function_name = aws_lambda_function.app.arn + batch_size = 5 +} diff --git a/test/e2e/fixtures/workspace/.gitkeep b/test/e2e/fixtures/workspace/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/test/e2e/global.d.ts b/test/e2e/global.d.ts new file mode 100644 index 0000000..9e8d40d --- /dev/null +++ b/test/e2e/global.d.ts @@ -0,0 +1,13 @@ +/* + * WebdriverIO's testrunner injects `browser`, `$`, and `$$` as real globals at + * runtime, but v9 no longer exposes a public `webdriverio/async` type entry + * for them (that subpath isn't in `webdriverio`'s package.json `exports`, and + * dropped-sync-mode-v9 folded the "async" types into an internal file + * instead). Reference that file directly to get the ambient declarations. + * + * This file only establishes global type augmentations and has no runtime + * exports to `import`, so a triple-slash reference is the only mechanism + * that applies here. + */ +// eslint-disable-next-line @typescript-eslint/triple-slash-reference +/// <reference path="../../node_modules/webdriverio/build/@types/async.d.ts" /> diff --git a/test/e2e/specs/resource-browser.e2e.ts b/test/e2e/specs/resource-browser.e2e.ts new file mode 100644 index 0000000..f33bc66 --- /dev/null +++ b/test/e2e/specs/resource-browser.e2e.ts @@ -0,0 +1,541 @@ +import * as assert from "node:assert"; + +import type * as vscode from "vscode"; +import type { CustomTreeSection, TreeItem, WebView } from "wdio-vscode-service"; + +import * as lstk from "../support/lstk.js"; + +/* + * End-to-end scenario, driven through the real rendered VS Code UI (not the + * `vscode` API in-process, see `src/test/**` for that): + * + * 1. `lstk start` (raw CLI, mirrors running it in a terminal). + * 2. `lstk tf apply` against a small wired application fixture: an SNS + * topic fanning out (via subscription) to an SQS queue, which triggers + * a Lambda function (via an event source mapping) running under a + * dedicated IAM role, plus an S3 bucket referenced by the function. + * 3. Open the Resources view, enable the resource browser (opt-in flag), + * refresh, and assert the tree contains *exactly* the deployed + * resources — nothing missing, nothing unexpected — including the + * function's IAM role wiring. + * 4. Select each resource and assert the Resource Details webview shows + * the full, correct set of fields. + * + * Two pieces of the fixture's wiring are real, deployed infrastructure but + * deliberately not asserted here, both confirmed directly against a running + * LocalStack instance during verification rather than assumed: + * + * - The Lambda event source mapping: the Resources view's "Default View" + * only auto-discovers a resource type once LocalStack's metamodel + * snapshot (`_localstack/pods/state/metamodel`) records at least one call + * to that type's list operation, and LocalStack does not record + * `listEventSourceMappings` there (`listFunctions` appears, + * `listEventSourceMappings` never does, even once the mapping reaches + * `State: Enabled`). No amount of refresh/retry changes that. + * - The SNS topic's subscription-count fields: LocalStack's + * `GetTopicAttributes` never updates `SubscriptionsConfirmed` / + * `SubscriptionsPending` / `SubscriptionsDeleted` even once a real + * (non-`PendingConfirmation`) SQS subscription exists — they're checked + * below only for well-formedness, not for a value the subscription + * should have produced. + * + * Both are LocalStack/extension-side gaps, not timing issues, and out of + * scope for this change to fix. + */ + +/** Matches the subdirectory name under test/e2e/fixtures/terraform/. */ +const TERRAFORM_FIXTURE = "small-serverless"; + +const REGION = "us-east-1"; +const ACCOUNT_ID = "000000000000"; + +const BUCKET_NAME = "wdio-e2e-test-bucket"; +const QUEUE_NAME = "wdio-e2e-test-queue"; +const TOPIC_NAME = "wdio-e2e-test-topic"; +const FUNCTION_NAME = "wdio-e2e-test-function"; +const ROLE_NAME = "wdio-e2e-test-function-role"; +const ROLE_PATH = "/service-role/"; + +const BUCKET_ARN = `arn:aws:s3:::${BUCKET_NAME}`; +const QUEUE_ARN = `arn:aws:sqs:${REGION}:${ACCOUNT_ID}:${QUEUE_NAME}`; +const TOPIC_ARN = `arn:aws:sns:${REGION}:${ACCOUNT_ID}:${TOPIC_NAME}`; +const FUNCTION_ARN = `arn:aws:lambda:${REGION}:${ACCOUNT_ID}:function:${FUNCTION_NAME}`; +const ROLE_ARN = `arn:aws:iam::${ACCOUNT_ID}:role${ROLE_PATH}${ROLE_NAME}`; + +/* + * Tree leaf labels come from ARN.resourceName (src/platforms/aws/models/arnModel.ts), + * which keeps everything after the resource-type segment — for a + * path-qualified IAM role that includes the path, not just the role name. + */ +const ROLE_TREE_LABEL = `service-role/${ROLE_NAME}`; + +const EXPECTED_SERVICE_TYPE_PAIRS = [ + "IAM::Roles", + "Lambda::Functions", + "S3::Buckets", + "SNS::Topics", + "SQS::Queues", +]; + +const S3_FIELDS = ["ARN", "Service", "Name", "Creation Date"]; + +const SQS_FIELDS = [ + "ARN", + "Service", + "Name", + "Visibility Timeout", + "Maximum Message Size", + "Message Retention Period", + "Delay Seconds", + "Receive Message Wait Time Seconds", + "SQS Managed SSE Enabled", + "Approximate Number of Messages", + "Approximate Number of Messages Delayed", + "Approximate Number of Messages Not Visible", + "Created Timestamp", + "Last Modified Timestamp", +]; + +const SNS_FIELDS = [ + "ARN", + "Service", + "Name", + "Display Name", + "Subscriptions Confirmed", + "Subscriptions Pending", + "Subscriptions Deleted", + "Policy", + "Effective Delivery Policy", +]; + +const LAMBDA_FUNCTION_FIELDS = [ + "ARN", + "Service", + "Name", + "State", + "Description", + "Runtime", + "Handler", + "Version", + "Role", + "Code Size (bytes)", + "Memory Size (MB)", + "Timeout (seconds)", + "Last Modified", + "Last Update Status", + "Package Type", + "Architectures", + "LogFormat", + "LogGroup", +]; + +const IAM_ROLE_FIELDS = [ + "ARN", + "Service", + "Role Name", + "Role ID", + "Path", + "Description", + "Max Session Duration", + "Created", + "Last Used", + "Assume Role Policy", +]; + +/** Sort-and-compare, for assertions where order doesn't matter but completeness does. */ +function assertExactly( + actual: string[], + expected: string[], + context: string, +): void { + assert.deepStrictEqual( + [...actual].sort(), + [...expected].sort(), + `${context}: expected exactly [${expected.join(", ")}], got [${actual.join(", ")}]`, + ); +} + +async function labelsOf(items: TreeItem[]): Promise<string[]> { + return Promise.all(items.map((item) => item.getLabel())); +} + +/** `"<label>::<description>"` pairs, for rows where the label alone isn't unique (e.g. Lambda's two resource types). */ +async function pairsOf(items: TreeItem[]): Promise<string[]> { + return Promise.all( + items.map( + async (item) => + `${await item.getLabel()}::${(await item.getDescription()) ?? ""}`, + ), + ); +} + +async function findByLabel( + items: TreeItem[], + label: string, +): Promise<TreeItem | undefined> { + const labels = await labelsOf(items); + const index = labels.indexOf(label); + return index === -1 ? undefined : items[index]; +} + +async function findByLabelAndDescription( + items: TreeItem[], + label: string, + description: string, +): Promise<TreeItem | undefined> { + for (const item of items) { + const [itemLabel, itemDescription] = await Promise.all([ + item.getLabel(), + item.getDescription(), + ]); + if (itemLabel === label && itemDescription === description) { + return item; + } + } + return undefined; +} + +interface ResourcesTree { + regionItems: TreeItem[]; + serviceTypeItems: TreeItem[]; + roleItems: TreeItem[]; + functionItems: TreeItem[]; + bucketItems: TreeItem[]; + topicItems: TreeItem[]; + queueItems: TreeItem[]; +} + +/** + * Refresh the Resources view and walk it down to the ARN level, retrying a + * handful of times (a stale/never-refreshed tree, not a slow emulator, is the + * expected failure mode here since `lstk tf apply` has already returned by + * the time this runs). + */ +async function waitForResourcesTree( + section: CustomTreeSection, +): Promise<ResourcesTree> { + const maxAttempts = 10; + let lastReason = "no attempt completed"; + + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + const refreshAction = await section.getAction("Refresh Resources"); + if (refreshAction) { + // VS Code only reveals section toolbar buttons on hover/focus (opacity: + // 0 otherwise), which fails WebDriver's native interactability check. + // Click via script instead, same as a real hover-then-click would do. + await browser.execute((el) => el.click(), refreshAction.elem); + } + await browser.pause(attempt === 1 ? 3000 : 8000); + + const rootItems = await section.getVisibleItems(); + const profileItem = await findByLabel(rootItems, "Profile: localstack"); + if (!profileItem) { + lastReason = 'no "Profile: localstack" row yet'; + continue; + } + + const regionItems = await profileItem.getChildren(); + const regionLabels = await labelsOf(regionItems); + if (!regionLabels.includes(REGION)) { + lastReason = `region "${REGION}" not present yet (saw: ${regionLabels.join(", ")})`; + continue; + } + const regionItem = regionItems[regionLabels.indexOf(REGION)]; + + const serviceTypeItems = await regionItem.getChildren(); + const pairs = await pairsOf(serviceTypeItems); + const missingPairs = EXPECTED_SERVICE_TYPE_PAIRS.filter( + (pair) => !pairs.includes(pair), + ); + if (missingPairs.length > 0) { + lastReason = `service/resource-type rows not all present yet (missing: ${missingPairs.join(", ")}; saw: ${pairs.join(", ")})`; + continue; + } + + const iamItem = await findByLabelAndDescription( + serviceTypeItems, + "IAM", + "Roles", + ); + const lambdaFunctionsItem = await findByLabelAndDescription( + serviceTypeItems, + "Lambda", + "Functions", + ); + const s3Item = await findByLabelAndDescription( + serviceTypeItems, + "S3", + "Buckets", + ); + const snsItem = await findByLabelAndDescription( + serviceTypeItems, + "SNS", + "Topics", + ); + const sqsItem = await findByLabelAndDescription( + serviceTypeItems, + "SQS", + "Queues", + ); + if (!iamItem || !lambdaFunctionsItem || !s3Item || !snsItem || !sqsItem) { + lastReason = "service/resource-type rows resolved inconsistently"; + continue; + } + + const [roleItems, functionItems, bucketItems, topicItems, queueItems] = + await Promise.all([ + iamItem.getChildren(), + lambdaFunctionsItem.getChildren(), + s3Item.getChildren(), + snsItem.getChildren(), + sqsItem.getChildren(), + ]); + + if ( + [roleItems, functionItems, bucketItems, topicItems, queueItems].some( + (items) => items.length === 0, + ) + ) { + lastReason = "one or more resource rows not present yet"; + continue; + } + + return { + regionItems, + serviceTypeItems, + roleItems, + functionItems, + bucketItems, + topicItems, + queueItems, + }; + } + + throw new Error( + `Resources view never showed the expected resources (last attempt: ${lastReason}).`, + ); +} + +/** + * Poll the (already-open) Resource Details webview until its table has rows. + * + * `$$()` returns a `ChainablePromiseArray`, which isn't itself a `Promise` + * (only its properties — `.length`, etc. — are) but does implement + * `Symbol.asyncIterator`, so it's iterated with `for await` rather than + * awaited directly. + */ +async function waitForDetailsTable(): Promise<Record<string, string>> { + await browser.waitUntil(async () => (await $$("table tr").length) > 0, { + timeout: 20_000, + interval: 500, + timeoutMsg: "Resource Details table never rendered", + }); + const fields: Record<string, string> = {}; + for await (const row of $$("table tr")) { + const cellTexts: string[] = []; + for await (const cell of row.$$("td")) { + cellTexts.push(await cell.getText()); + } + const [field, value] = cellTexts; + fields[field] = value; + } + return fields; +} + +async function readResourceDetails( + item: TreeItem, +): Promise<Record<string, string>> { + await item.select(); + const workbench = await browser.getWorkbench(); + // Resource Details' webview HTML has no <title>, so it can't be matched by + // title (document.title is empty); it's the only webview in this scenario, + // so just wait for one to exist. + const webview = await browser.waitUntil<WebView | undefined>( + async () => { + const webviews = await workbench.getAllWebviews(); + return webviews[0]; + }, + { + timeout: 15_000, + interval: 500, + timeoutMsg: '"Resource Details" webview never appeared', + }, + ); + await webview.open(); + try { + return await waitForDetailsTable(); + } finally { + await webview.close(); + } +} + +suite("LocalStack Resources view + Resource Details (e2e)", () => { + suiteSetup(async function () { + this.timeout(5 * 60_000); + await lstk.start(); + await lstk.terraformApply(TERRAFORM_FIXTURE); + }); + + suiteTeardown(async function () { + this.timeout(2 * 60_000); + await lstk.terraformDestroy(TERRAFORM_FIXTURE).catch(() => undefined); + await lstk.stop().catch(() => undefined); + }); + + test("shows exactly the deployed wired application and correct Resource Details for each", async () => { + const workbench = await browser.getWorkbench(); + + // executeWorkbench lives on `browser` (it's the RPC bridge to the + // extension host), not on the Workbench page object. Its callback param + // is typed `any` by the library; annotate it with the real `vscode` + // module's types rather than letting `any` leak into the callback body. + await browser.executeWorkbench((api: typeof vscode) => + api.commands.executeCommand("localstack.enableResourceBrowser"), + ); + + const viewControl = await workbench + .getActivityBar() + .getViewControl("LocalStack"); + assert.ok( + viewControl, + 'Could not find the "LocalStack" activity bar entry.', + ); + const sideBar = await viewControl.openView(); + // wdio-vscode-service matches section titles against the rendered DOM text + // exactly, and VS Code renders view section headers in all caps. + const section = (await sideBar + .getContent() + .getSection("RESOURCES")) as CustomTreeSection; + + const tree = await waitForResourcesTree(section); + + // Completeness: exactly the deployed region and service/resource-type + // rows, nothing left over from a stale container and nothing extra from + // the fixture. + assertExactly(await labelsOf(tree.regionItems), [REGION], "Regions"); + assertExactly( + await pairsOf(tree.serviceTypeItems), + EXPECTED_SERVICE_TYPE_PAIRS, + "Service/resource-type rows", + ); + + // Completeness: exactly one resource under each row. + assertExactly( + await labelsOf(tree.roleItems), + [ROLE_TREE_LABEL], + "IAM roles", + ); + assertExactly( + await labelsOf(tree.functionItems), + [FUNCTION_NAME], + "Lambda functions", + ); + assertExactly(await labelsOf(tree.bucketItems), [BUCKET_NAME], "S3 buckets"); + assertExactly(await labelsOf(tree.topicItems), [TOPIC_NAME], "SNS topics"); + assertExactly(await labelsOf(tree.queueItems), [QUEUE_NAME], "SQS queues"); + + // Resource Details: full field set + known values for the S3 bucket. + const bucketFields = await readResourceDetails(tree.bucketItems[0]); + assertExactly( + Object.keys(bucketFields), + S3_FIELDS, + "S3 Resource Details fields", + ); + assert.strictEqual(bucketFields.ARN, BUCKET_ARN); + assert.strictEqual(bucketFields.Service, "S3"); + assert.strictEqual(bucketFields.Name, BUCKET_NAME); + assert.ok( + !Number.isNaN(Date.parse(bucketFields["Creation Date"])), + `"Creation Date" should be a parseable date, got: ${bucketFields["Creation Date"]}`, + ); + + // Resource Details: full field set + known values for the SQS queue. + const queueFields = await readResourceDetails(tree.queueItems[0]); + assertExactly( + Object.keys(queueFields), + SQS_FIELDS, + "SQS Resource Details fields", + ); + assert.strictEqual(queueFields.ARN, QUEUE_ARN); + assert.strictEqual(queueFields.Service, "SQS"); + assert.strictEqual(queueFields.Name, QUEUE_NAME); + // Set explicitly by the Terraform fixture (e2e/fixtures/terraform/main.tf). + assert.strictEqual(queueFields["Visibility Timeout"], "60"); + assert.strictEqual(queueFields["Message Retention Period"], "1209600"); + assert.strictEqual(queueFields["Delay Seconds"], "5"); + // LocalStack/AWS defaults for everything the fixture didn't set explicitly — + // checked for well-formedness rather than an exact value. + assert.match(queueFields["Maximum Message Size"], /^\d+$/); + assert.match(queueFields["Receive Message Wait Time Seconds"], /^\d+$/); + assert.match(queueFields["Approximate Number of Messages"], /^\d+$/); + assert.match( + queueFields["Approximate Number of Messages Delayed"], + /^\d+$/, + ); + assert.match( + queueFields["Approximate Number of Messages Not Visible"], + /^\d+$/, + ); + assert.match(queueFields["SQS Managed SSE Enabled"], /^(true|false)$/); + assert.ok(!Number.isNaN(Date.parse(queueFields["Created Timestamp"]))); + assert.ok( + !Number.isNaN(Date.parse(queueFields["Last Modified Timestamp"])), + ); + + // Resource Details: full field set + known values for the SNS topic. + // Subscription counters are checked for well-formedness only, not a + // wiring-derived value: confirmed directly against a running instance + // that LocalStack's GetTopicAttributes never updates these counters even + // once a real (non-pending) SQS subscription exists — an emulation gap, + // not a timing issue. + const topicFields = await readResourceDetails(tree.topicItems[0]); + assertExactly( + Object.keys(topicFields), + SNS_FIELDS, + "SNS Resource Details fields", + ); + assert.strictEqual(topicFields.ARN, TOPIC_ARN); + assert.strictEqual(topicFields.Service, "SNS"); + assert.strictEqual(topicFields.Name, TOPIC_NAME); + assert.strictEqual(topicFields["Display Name"], "WDIO E2E Test Topic"); + assert.match(topicFields["Subscriptions Confirmed"], /^\d+$/); + assert.match(topicFields["Subscriptions Pending"], /^\d+$/); + assert.match(topicFields["Subscriptions Deleted"], /^\d+$/); + + // Resource Details: full field set + known values for the Lambda + // function, including its wiring to the IAM role. + const functionFields = await readResourceDetails(tree.functionItems[0]); + assertExactly( + Object.keys(functionFields), + LAMBDA_FUNCTION_FIELDS, + "Lambda function Resource Details fields", + ); + assert.strictEqual(functionFields.ARN, FUNCTION_ARN); + assert.strictEqual(functionFields.Service, "Lambda"); + assert.strictEqual(functionFields.Name, FUNCTION_NAME); + assert.strictEqual(functionFields.Role, ROLE_ARN); + assert.strictEqual( + functionFields.Description, + "WebdriverIO e2e demo function", + ); + assert.strictEqual(functionFields["Memory Size (MB)"], "256"); + assert.strictEqual(functionFields["Timeout (seconds)"], "30"); + + // Resource Details: full field set + known values for the IAM role. + const roleFields = await readResourceDetails(tree.roleItems[0]); + assertExactly( + Object.keys(roleFields), + IAM_ROLE_FIELDS, + "IAM role Resource Details fields", + ); + assert.strictEqual(roleFields.ARN, ROLE_ARN); + assert.strictEqual(roleFields.Service, "IAM"); + assert.strictEqual(roleFields["Role Name"], ROLE_NAME); + assert.strictEqual(roleFields.Path, ROLE_PATH); + assert.strictEqual( + roleFields.Description, + "Execution role for the WebdriverIO e2e demo Lambda function", + ); + assert.strictEqual(roleFields["Max Session Duration"], "7200"); + }); +}); diff --git a/test/e2e/support/lstk.ts b/test/e2e/support/lstk.ts new file mode 100644 index 0000000..ea879fd --- /dev/null +++ b/test/e2e/support/lstk.ts @@ -0,0 +1,51 @@ +import { execFile } from "node:child_process"; +import * as path from "node:path"; +import { promisify } from "node:util"; + +const execFileAsync = promisify(execFile); + +const REPO_ROOT = path.join(__dirname, "..", "..", ".."); +const TERRAFORM_FIXTURES_ROOT = path.join(__dirname, "..", "fixtures", "terraform"); + +/** Run an `lstk` subcommand, throwing (with captured stdout/stderr) on a non-zero exit. */ +async function run(args: string[], cwd: string): Promise<void> { + try { + await execFileAsync("lstk", args, { + cwd, + maxBuffer: 16 * 1024 * 1024, + }); + } catch (error) { + const { stdout, stderr } = error as { stdout?: string; stderr?: string }; + throw new Error( + `"lstk ${args.join(" ")}" failed:\n${stdout ?? ""}\n${stderr ?? ""}`, + ); + } +} + +/** `lstk start` — blocks until the emulator is up. */ +export async function start(): Promise<void> { + await run(["start"], REPO_ROOT); +} + +/** `lstk stop` — used for teardown. */ +export async function stop(): Promise<void> { + await run(["stop"], REPO_ROOT); +} + +/** + * `lstk tf init` + `lstk tf apply -auto-approve` against the named fixture + * directory (e.g. `"small-serverless"` for `fixtures/terraform/small-serverless/`). + * Each suite has its own fixture subdirectory, so this always takes a name + * rather than assuming a single fixture for the whole test/e2e/ tree. + */ +export async function terraformApply(fixture: string): Promise<void> { + const dir = path.join(TERRAFORM_FIXTURES_ROOT, fixture); + await run(["tf", "init"], dir); + await run(["tf", "apply", "-auto-approve"], dir); +} + +/** `lstk tf destroy -auto-approve` against the named fixture directory. */ +export async function terraformDestroy(fixture: string): Promise<void> { + const dir = path.join(TERRAFORM_FIXTURES_ROOT, fixture); + await run(["tf", "destroy", "-auto-approve"], dir); +} diff --git a/test/e2e/tsconfig.json b/test/e2e/tsconfig.json new file mode 100644 index 0000000..cf76068 --- /dev/null +++ b/test/e2e/tsconfig.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + // webdriverio's own .d.ts files (build/utils/interception/*, etc.) fail + // to resolve a few of THEIR internal type-only imports (@wdio/protocols, + // webdriver, urlpattern-polyfill) under pnpm's non-flat node_modules + // layout, even though those packages are genuinely installed and + // resolve fine at runtime. Not our code's problem to fix — skip + // checking .d.ts files entirely, which is the standard remedy for + // exactly this class of dependency-internal noise. + "skipLibCheck": true, + "types": [ + "node", + "mocha", + "@wdio/mocha-framework", + "expect-webdriverio", + "wdio-vscode-service" + ] + }, + "include": ["**/*.ts", "../../wdio.conf.ts"], + /* Override rather than inherit the root tsconfig's `exclude`: it lists + * "test" (to keep this suite out of the extension's own build/type-check), + * which — rebased relative to this file — would otherwise also exclude + * this project's own directory. */ + "exclude": [] +} diff --git a/tsconfig.json b/tsconfig.json index 74e3182..549ae15 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,5 +16,6 @@ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ // "noUnusedParameters": true, /* Report errors on unused parameters. */ }, - "include": ["**/*.ts", "**/*.tsx", "**/*.mjs", "**/.*.mjs"] + "include": ["**/*.ts", "**/*.tsx", "**/*.mjs", "**/.*.mjs"], + "exclude": ["node_modules", "out", "test", "wdio.conf.ts"] } diff --git a/wdio.conf.ts b/wdio.conf.ts new file mode 100644 index 0000000..4974cbc --- /dev/null +++ b/wdio.conf.ts @@ -0,0 +1,59 @@ +import * as path from "node:path"; + +/* + * WebdriverIO + wdio-vscode-service e2e config. Independent of, and does not + * replace, the `@vscode/test-cli`/`@vscode/test-electron` suite driven by + * `.vscode-test.mjs` (`pnpm test`) — that one drives the `vscode` API + * in-process; this one drives the real rendered UI (tree views, webviews) + * through a WebDriver session against a genuine Extension Development Host. + * + * Requires the extension to already be built (`pnpm run compile`, wired up + * as `pretest:e2e`) since wdio-vscode-service loads `./out/extension.js` the + * same way a real VS Code install would. + */ +export const config: WebdriverIO.Config = { + runner: "local", + outputDir: "test/e2e/logs", + + specs: ["./test/e2e/specs/**/*.e2e.ts"], + + maxInstances: 1, + + // Project-local rather than the default os.tmpdir(): the shared OS-wide + // temp directory is also where unrelated tools/processes on the same + // machine cache their own chromedriver downloads, so an interrupted + // download there can leave a corrupt entry (folder exists, executable + // missing) that silently breaks every future run system-wide until + // someone manually clears it. Scoping the cache to this repo confines + // that failure mode to a single, already-gitignored, easy-to-clear + // directory (`rm -rf .wdio-vscode-service`) instead. + cacheDir: path.join(__dirname, ".wdio-vscode-service/browser-cache"), + + capabilities: [ + { + browserName: "vscode", + browserVersion: "stable", + "wdio:enforceWebDriverClassic": true, + "wdio:vscodeOptions": { + extensionPath: __dirname, + workspacePath: path.join(__dirname, "test/e2e/fixtures/workspace"), + }, + }, + ], + + services: ["vscode"], + + framework: "mocha", + mochaOpts: { + // Matches the TDD interface (suite/test/suiteSetup/suiteTeardown) already + // used by the unit tests in src/test/**. + ui: "tdd", + // The scenario shells out to `lstk start` and `lstk tf apply`, both of + // which take real wall-clock time against a real emulator. + timeout: 5 * 60_000, + }, + + reporters: ["spec"], + + logLevel: "info", +}; From 349acaec285127186bb5f05a926657c88d2415b0 Mon Sep 17 00:00:00 2001 From: Peter Smith <peter.smith@localstack.cloud> Date: Mon, 13 Jul 2026 10:33:05 +1200 Subject: [PATCH 3/7] style: reformat e2e test files with biome Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --- test/e2e/specs/resource-browser.e2e.ts | 6 +++++- test/e2e/support/lstk.ts | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/test/e2e/specs/resource-browser.e2e.ts b/test/e2e/specs/resource-browser.e2e.ts index f33bc66..1fab7cb 100644 --- a/test/e2e/specs/resource-browser.e2e.ts +++ b/test/e2e/specs/resource-browser.e2e.ts @@ -430,7 +430,11 @@ suite("LocalStack Resources view + Resource Details (e2e)", () => { [FUNCTION_NAME], "Lambda functions", ); - assertExactly(await labelsOf(tree.bucketItems), [BUCKET_NAME], "S3 buckets"); + assertExactly( + await labelsOf(tree.bucketItems), + [BUCKET_NAME], + "S3 buckets", + ); assertExactly(await labelsOf(tree.topicItems), [TOPIC_NAME], "SNS topics"); assertExactly(await labelsOf(tree.queueItems), [QUEUE_NAME], "SQS queues"); diff --git a/test/e2e/support/lstk.ts b/test/e2e/support/lstk.ts index ea879fd..5d5371e 100644 --- a/test/e2e/support/lstk.ts +++ b/test/e2e/support/lstk.ts @@ -5,7 +5,12 @@ import { promisify } from "node:util"; const execFileAsync = promisify(execFile); const REPO_ROOT = path.join(__dirname, "..", "..", ".."); -const TERRAFORM_FIXTURES_ROOT = path.join(__dirname, "..", "fixtures", "terraform"); +const TERRAFORM_FIXTURES_ROOT = path.join( + __dirname, + "..", + "fixtures", + "terraform", +); /** Run an `lstk` subcommand, throwing (with captured stdout/stderr) on a non-zero exit. */ async function run(args: string[], cwd: string): Promise<void> { From 5e9f405e02970a363dc8b05f86192ab1e1ed64bf Mon Sep 17 00:00:00 2001 From: Peter Smith <peter.smith@localstack.cloud> Date: Mon, 13 Jul 2026 10:37:15 +1200 Subject: [PATCH 4/7] fix(ci): install Terraform in the e2e job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first real CI run failed with "terraform not found in PATH" — unlike Docker, Terraform isn't preinstalled on ubuntu-latest. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --- .github/workflows/build.yml | 8 ++++++++ openspec/changes/add-webdriverio-e2e-testing/design.md | 4 ++-- openspec/changes/add-webdriverio-e2e-testing/tasks.md | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 09f36bc..8dbb1a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -145,6 +145,14 @@ jobs: - name: Install lstk run: npm install -g @localstack/lstk + - name: Setup Terraform + uses: hashicorp/setup-terraform@dfe3c3f87815947d99a8997f908cb6525fc44e9e # v4.0.1 + with: + # The wrapper script exists to capture stdout/stderr into this + # action's own step outputs, which nothing here reads; `lstk tf` + # just needs a plain `terraform` binary on PATH. + terraform_wrapper: false + - name: Test (e2e) run: xvfb-run -a pnpm test:e2e env: diff --git a/openspec/changes/add-webdriverio-e2e-testing/design.md b/openspec/changes/add-webdriverio-e2e-testing/design.md index 2822f65..36c8bc6 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/design.md +++ b/openspec/changes/add-webdriverio-e2e-testing/design.md @@ -37,7 +37,7 @@ The extension already has one automated test layer: `pnpm test` (`vscode-test` / **`wdio.conf.ts` sets a project-local top-level `cacheDir` for chromedriver, rather than leaving `@wdio/utils` default to `os.tmpdir()`.** Traced directly (`@wdio/utils`'s `getCacheDir(options, caps)`: `driverOptions.cacheDir || options.cacheDir || os.tmpdir()`) to the actual bug behind repeated "browser folder exists but the executable is missing" failures during verification: the shared, OS-wide temp directory is also where every *other* tool/process on the same machine caches its own chromedriver downloads, with no namespacing per project. An interrupted download there (network blip, a killed process) leaves a corrupt entry that silently breaks every subsequent run — not just this project's — until someone happens to notice and manually clears it. `wdio-vscode-service` already scopes its own VS Code binary cache to `.wdio-vscode-service/` (`DEFAULT_CACHE_PATH = path.join(process.cwd(), '.wdio-vscode-service')`); chromedriver just never got the same treatment from the layer above it. Pointing `cacheDir` at `.wdio-vscode-service/browser-cache` doesn't prevent a download from ever getting corrupted — `@puppeteer/browsers`' fetcher trusts folder-existence as completion with no checksum/completion-marker verification, an upstream gap not fixable from our config — but it confines any corruption to a single, already-gitignored, already-documented directory, turning recovery from "unrelated shared-tmp mystery" into `rm -rf .wdio-vscode-service`. -**New CI job in the existing `build.yml`, not a separate workflow file or a replacement of the existing `Test` job.** Add a `test-e2e` job alongside `format`/`lint`/`type-check`/`test`, for consistency with that existing structure. It runs `xvfb-run -a pnpm test:e2e` (matching the existing job's `xvfb-run` pattern for `vscode-test`, since both need a virtual display in headless CI), after installing `lstk` via `npm install -g @localstack/lstk` (the package published to the npm registry, kept in sync with the CLI's own GitHub releases) — Docker itself is already preinstalled on `ubuntu-latest`. +**New CI job in the existing `build.yml`, not a separate workflow file or a replacement of the existing `Test` job.** Add a `test-e2e` job alongside `format`/`lint`/`type-check`/`test`, for consistency with that existing structure. It runs `xvfb-run -a pnpm test:e2e` (matching the existing job's `xvfb-run` pattern for `vscode-test`, since both need a virtual display in headless CI), after installing `lstk` via `npm install -g @localstack/lstk` (the package published to the npm registry, kept in sync with the CLI's own GitHub releases) and Terraform via `hashicorp/setup-terraform` (`terraform_wrapper: false`, since nothing reads the wrapper's step-output capture — `lstk tf` just needs a plain `terraform` binary on PATH). Docker itself is already preinstalled on `ubuntu-latest`; Terraform is not — its absence surfaced as the first real CI run's failure (`lstk tf init`: `terraform not found in PATH`), unlike local dev where it's already on most contributors' machines. **The `test-e2e` job's `Setup Node` step explicitly pins `node-version-file: .node-version`, unlike the other four jobs (which specify no version at all).** Given the Node-version sensitivity discovered above, leaving this job to whatever Node version a runner image happens to default to would reintroduce the exact same risk under different conditions. Explicitly reading this repo's own `.node-version` (24) removes that ambiguity for the one job that's actually sensitive to it; the other jobs aren't touched since nothing established they're affected. @@ -94,7 +94,7 @@ The event source mapping itself is real, deployed infrastructure (confirmed dire ## Risks / Trade-offs -- **[Risk] CI runner needs `lstk`, Docker, and enough resources to run a real LocalStack container** → `ubuntu-latest` already has Docker preinstalled; the job installs `lstk` itself via `npm install -g @localstack/lstk` (see Decisions). (`lstk tf init` also needs to download the `hashicorp/archive` provider alongside `hashicorp/aws` — the same registry-access requirement as today, not a new category of dependency.) +- **[Risk] CI runner needs `lstk`, Terraform, Docker, and enough resources to run a real LocalStack container** → `ubuntu-latest` already has Docker preinstalled; the job installs `lstk` (`npm install -g @localstack/lstk`) and Terraform (`hashicorp/setup-terraform`) itself (see Decisions). (`lstk tf init` also needs to download the `hashicorp/archive` provider alongside `hashicorp/aws` — the same registry-access requirement as today, not a new category of dependency.) - **[Risk] New job materially increases PR CI wall-clock time** (spinning up a real container + Extension Development Host + WebDriver session, vs. the in-process `vscode-test` job) → acceptable for now since it's one demonstration suite; revisit parallelization/sharding once further e2e suites start landing. - **[Risk] Flaky tree/webview timing in CI** (slower/more contended than local dev) → mitigated by the bounded-retry `waitForResourcesTree` / `waitUntil`-polling `waitForDetailsTable` helpers rather than fixed sleeps, but CI-specific flakiness can't be fully ruled out until this actually runs in the pipeline a few times. - **[Trade-off] Terraform fixture state files (`terraform.tfstate*`, `.terraform/`, `.terraform.lock.hcl`) are runtime artifacts, not checked in** → `.gitignore`'d; each CI run starts from a clean fixture. Local runs will accumulate this state between manual `test:e2e` invocations, which is fine (matches ordinary Terraform workflow) but means a developer who force-kills a run mid-suite may need to `lstk tf destroy` by hand before the next one. diff --git a/openspec/changes/add-webdriverio-e2e-testing/tasks.md b/openspec/changes/add-webdriverio-e2e-testing/tasks.md index 27d5d80..e0e4abb 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/tasks.md +++ b/openspec/changes/add-webdriverio-e2e-testing/tasks.md @@ -44,7 +44,7 @@ ## 7. CI - [x] 7.1 Confirm the `lstk` CLI install mechanism for `ubuntu-latest` runners: `npm install -g @localstack/lstk`. -- [x] 7.2 Add a `test-e2e` job to `.github/workflows/build.yml` (checkout, pnpm/Node setup, `pnpm install --frozen-lockfile`, install `lstk`, `xvfb-run -a pnpm test:e2e`), running on every pull request against `main` alongside the existing jobs, with: +- [x] 7.2 Add a `test-e2e` job to `.github/workflows/build.yml` (checkout, pnpm/Node setup, `pnpm install --frozen-lockfile`, install `lstk`, install Terraform via `hashicorp/setup-terraform` (`terraform_wrapper: false`), `xvfb-run -a pnpm test:e2e`), running on every pull request against `main` alongside the existing jobs, with: - `env: LOCALSTACK_AUTH_TOKEN: ${{ secrets.LOCALSTACK_AUTH_TOKEN }}` scoped to this job only (the secret itself is added to the GitHub repository outside this change). - `if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository` so the job is skipped (not failed) on pull requests from forks, which never have access to repository secrets. @@ -61,3 +61,4 @@ - [x] 9.3 Add a project-local top-level `cacheDir` (`.wdio-vscode-service/browser-cache`) to `wdio.conf.ts`, so chromedriver's download cache is no longer the shared, unnamespaced `os.tmpdir()` that other tools/processes on the same machine also write to — confining any future interrupted-download corruption to a single, already-gitignored, easy-to-clear directory. - [x] 9.4 Move the Terraform fixture into its own named subdirectory (`test/e2e/fixtures/terraform/small-serverless/main.tf`), generalize `lstk.ts`'s `terraformApply`/`terraformDestroy` to take a fixture name instead of assuming a single fixture, update the demonstration suite's `suiteSetup`/`suiteTeardown` calls accordingly, and generalize the `.gitignore` Terraform-artifact patterns with `**` so sibling fixture subdirectories are covered without further edits — anticipating that more suites (and their own fixtures) will land here. - [x] 9.5 Upgrade `@wdio/repl` from the backward-pinned `9.4.4` to the naturally-resolved `9.16.2`: verify via the npm registry that every other wdio-org package this project depends on shows the identical keyid transition at the same version boundary (confirming a coordinated pipeline change, not a takeover), then swap `pnpm-workspace.yaml`'s `trustPolicyExclude`/`overrides` entries accordingly and `pnpm clean --lockfile && pnpm install` to rebuild the lockfile cleanly. +- [x] 9.6 Add a `Setup Terraform` step (`hashicorp/setup-terraform`, `terraform_wrapper: false`) to the `test-e2e` job — the first real CI run failed with `lstk tf init`: `terraform not found in PATH`, since unlike Docker, Terraform isn't preinstalled on `ubuntu-latest`. From c7c0093fb50207af21035b2341d25c67590ae430 Mon Sep 17 00:00:00 2001 From: Peter Smith <peter.smith@localstack.cloud> Date: Mon, 13 Jul 2026 10:46:47 +1200 Subject: [PATCH 5/7] debug(e2e): log lstk command output on success too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI's e2e run failed with the tree showing no resources, but the only existing signal was silence — lstk.ts previously only surfaced stdout/stderr when a command failed. Logging on success too so the next CI run's output actually shows what lstk start/tf apply did. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --- test/e2e/support/lstk.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/test/e2e/support/lstk.ts b/test/e2e/support/lstk.ts index 5d5371e..73e44ce 100644 --- a/test/e2e/support/lstk.ts +++ b/test/e2e/support/lstk.ts @@ -12,18 +12,23 @@ const TERRAFORM_FIXTURES_ROOT = path.join( "terraform", ); -/** Run an `lstk` subcommand, throwing (with captured stdout/stderr) on a non-zero exit. */ +/** + * Run an `lstk` subcommand, throwing (with captured stdout/stderr) on a + * non-zero exit. Output is logged even on success — these commands are the + * suite's only window into whether the emulator/fixture actually came up as + * expected, and CI environments can behave differently than local ones. + */ async function run(args: string[], cwd: string): Promise<void> { + const label = `lstk ${args.join(" ")}`; try { - await execFileAsync("lstk", args, { + const { stdout, stderr } = await execFileAsync("lstk", args, { cwd, maxBuffer: 16 * 1024 * 1024, }); + console.log(`[${label}]:\n${stdout}${stderr}`); } catch (error) { const { stdout, stderr } = error as { stdout?: string; stderr?: string }; - throw new Error( - `"lstk ${args.join(" ")}" failed:\n${stdout ?? ""}\n${stderr ?? ""}`, - ); + throw new Error(`"${label}" failed:\n${stdout ?? ""}\n${stderr ?? ""}`); } } From d2a3a6073d61a011324319d41a5067ef33757e1b Mon Sep 17 00:00:00 2001 From: Peter Smith <peter.smith@localstack.cloud> Date: Mon, 13 Jul 2026 12:02:32 +1200 Subject: [PATCH 6/7] fix(resources): resolve LocalStack profiles without ~/.aws/config AWSConfig.getClientConfig only worked for the default `localstack` profile if ~/.aws/config happened to have a matching section, so a fresh install (no AWS config at all) showed duplicate, errored `Profile: localstack` rows and an empty Resources tree. Every LocalStack-managed profile now resolves its endpoint/credentials statically instead, matching the convention already used for `localstack#<accountId>` entries. Verified by moving ~/.aws/config and ~/.aws/credentials aside and re-running the e2e demonstration suite end-to-end. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --- .../add-webdriverio-e2e-testing/design.md | 3 ++ .../add-webdriverio-e2e-testing/proposal.md | 6 +-- .../add-webdriverio-e2e-testing/tasks.md | 7 ++++ src/platforms/aws/models/awsConfig.ts | 40 ++++++++++++------- src/platforms/aws/models/metamodelFocus.ts | 5 +-- src/test/models/awsConfig.test.ts | 24 ++++++++++- src/utils/localstack-endpoint.ts | 10 +++-- 7 files changed, 70 insertions(+), 25 deletions(-) diff --git a/openspec/changes/add-webdriverio-e2e-testing/design.md b/openspec/changes/add-webdriverio-e2e-testing/design.md index 36c8bc6..cee7599 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/design.md +++ b/openspec/changes/add-webdriverio-e2e-testing/design.md @@ -90,6 +90,9 @@ The event source mapping itself is real, deployed infrastructure (confirmed dire **Lambda's deployment package is generated at `apply` time via the `hashicorp/archive` provider's `archive_file` data source, with the handler source inline (`source { filename, content = <<EOF ... EOF }`) rather than a checked-in file of any kind.** This keeps the entire fixture as plain, diffable HCL — no binary asset in the repo, no separate handler source file to keep in sync with a prebuilt zip, and no risk of a stray `.js`/`.py` fixture file being unintentionally swept into the root `eslint.config.mjs`'s rules (which have no top-level `files` restriction limiting them to TypeScript). `aws_lambda_function.source_code_hash` is set from `archive_file`'s `output_base64sha256` so Terraform correctly detects when the inline handler content changes and redeploys, rather than treating the (constant) output filename as unchanged. `archive` only manipulates local files (no credentials, no network calls beyond the initial provider download from the registry, same category as the `aws` provider already required) — adding it to `required_providers` is the only new cost. The generated `.zip` itself is a build artifact, `.gitignore`'d alongside the other Terraform run artifacts. +**LocalStack profile resolution (`AWSConfig.getClientConfig`) was fixed to never depend on `~/.aws/config`, a production bug this change's own verification surfaced.** Running the demonstration suite against a machine with no `~/.aws/config` at all (a fresh install, and the actual state of a clean CI runner) showed the Resources view rendering two duplicate `Profile: localstack` rows, both erroring with real-AWS `CredentialsProviderError`/`InvalidClientTokenId`. Root cause: the default `localstack` profile's client config only injected an endpoint override when `~/.aws/config` happened to already have a matching `[profile localstack]` section (`endpoint_url`), and injected no credentials at all — unlike the `localstack#<accountId>` non-default-account path, which already used static dummy credentials (account id as access key) because it has no config section of its own to read. Every SDK client built for a LocalStack profile — `STS.getCallerIdentity`/`IAM.getAccountAlias` (the profile row's identity) and every resource-listing client in `declarative/engine.ts` — goes through this one function, so a missing config file broke resource listing entirely, not just the profile row's status. Fixed by making `getClientConfig` resolve every LocalStack-managed profile (default or `localstack#<accountId>`) the same way: a fixed, hardcoded default endpoint (the same well-known default `getLocalStackEndpointUrl()` falls back to) and static credentials keyed by account id, with no `~/.aws/config` read at all. Re-verified directly: `pnpm test:e2e` passes with `~/.aws/config`/`~/.aws/credentials` moved out of the way entirely. +**[Trade-off]** This removes the ability to point LocalStack SDK calls at a non-default port via `~/.aws/config`'s `[profile localstack]` `endpoint_url` override — accepted for now, since the non-default-account path already implicitly had this same limitation (it always resolved to the same `[profile localstack]` section regardless of account), and a fixed default is simpler and removes an entire class of "works on my machine, breaks on a fresh one" failures. Revisit if a real need for a configurable LocalStack port on the SDK-call path emerges. + **Tree-walking assertions match tree rows by label *and* description, not label alone.** Lambda registers two resource types (`function`, `event-source-mapping`, `lambda.ts:27-169`), which render as two sibling tree rows both labeled `Lambda` (one described `Functions`, the other `Event Source Mappings`) — the existing `findByLabel`/`.indexOf(label)` pattern (workable when every service+type row had a distinct label) breaks on that duplicate. The demonstration suite's tree-walking helper is updated to resolve rows by `(label, description)` pairs instead. ## Risks / Trade-offs diff --git a/openspec/changes/add-webdriverio-e2e-testing/proposal.md b/openspec/changes/add-webdriverio-e2e-testing/proposal.md index aad340a..eb5ca8c 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/proposal.md +++ b/openspec/changes/add-webdriverio-e2e-testing/proposal.md @@ -18,12 +18,12 @@ This PR delivers only the framework and one demonstration suite, not the full ba - `e2e-testing`: WebdriverIO + `wdio-vscode-service` framework for driving the extension's real rendered UI in a genuine Extension Development Host, plus the `lstk`/Terraform fixture conventions e2e suites use to stand up LocalStack state, and the CI job that runs it on every PR. ### Modified Capabilities -- None. This introduces a new testing capability; it does not change the requirements of any existing product capability (`resource-browser`, etc.). The demonstration suite verifies existing `resource-browser` behavior but doesn't alter its spec. +- `resource-browser`: this change's own verification (running the demonstration suite against a machine with no `~/.aws/config`) surfaced a production bug — the default `localstack` profile's identity and every LocalStack resource-listing SDK call depended on `~/.aws/config` having a matching section, so a fresh install showed duplicate, errored `Profile: localstack` rows and an empty Resources tree. Fixed in `AWSConfig.getClientConfig` (see design.md's Decisions); no requirement text changed, since the shipped spec never explicitly sanctioned the buggy behavior. ## Impact - **New dependencies** (devDependencies): `@wdio/cli`, `@wdio/local-runner`, `@wdio/mocha-framework`, `@wdio/spec-reporter`, `expect-webdriverio`, `wdio-vscode-service`, `webdriverio`, `tsx`. - **New files**: `wdio.conf.ts`, `test/e2e/**` (support helper, fixtures — including a small prebuilt Lambda deployment package — specs, `tsconfig.json`, `global.d.ts`). -- **Modified files**: `package.json` (scripts + devDependencies), `tsconfig.json` (exclude e2e sources), `eslint.config.mjs` (separate parser project for e2e sources), `.gitignore` (ignore e2e run artifacts), `pnpm-workspace.yaml` (trust/build-script policy for wdio's transitive deps), `.github/workflows/build.yml` (new CI job). +- **Modified files**: `package.json` (scripts + devDependencies), `tsconfig.json` (exclude e2e sources), `eslint.config.mjs` (separate parser project for e2e sources), `.gitignore` (ignore e2e run artifacts), `pnpm-workspace.yaml` (trust/build-script policy for wdio's transitive deps), `.github/workflows/build.yml` (new CI job), `src/platforms/aws/models/awsConfig.ts` and `src/platforms/aws/models/metamodelFocus.ts` (LocalStack profile resolution bug fix), `src/utils/localstack-endpoint.ts` (exported a shared constant), `src/test/models/awsConfig.test.ts` (regression tests for the fix). - **CI runtime**: adds a job per PR that shells out to `lstk start`/`lstk tf apply` and drives a real Extension Development Host — meaningfully slower than the existing in-process `vscode-test` job, and requires the `lstk` CLI and Terraform to be available in the CI runner image. -- **No production/runtime code changes** — this is entirely developer tooling and CI. +- **Production/runtime code change**: `AWSConfig.getClientConfig` now resolves every LocalStack-managed profile's endpoint/credentials statically rather than reading `~/.aws/config` — a bug fix this change's own verification surfaced, not scope creep (see Modified Capabilities above and design.md's Decisions). diff --git a/openspec/changes/add-webdriverio-e2e-testing/tasks.md b/openspec/changes/add-webdriverio-e2e-testing/tasks.md index e0e4abb..7543f92 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/tasks.md +++ b/openspec/changes/add-webdriverio-e2e-testing/tasks.md @@ -62,3 +62,10 @@ - [x] 9.4 Move the Terraform fixture into its own named subdirectory (`test/e2e/fixtures/terraform/small-serverless/main.tf`), generalize `lstk.ts`'s `terraformApply`/`terraformDestroy` to take a fixture name instead of assuming a single fixture, update the demonstration suite's `suiteSetup`/`suiteTeardown` calls accordingly, and generalize the `.gitignore` Terraform-artifact patterns with `**` so sibling fixture subdirectories are covered without further edits — anticipating that more suites (and their own fixtures) will land here. - [x] 9.5 Upgrade `@wdio/repl` from the backward-pinned `9.4.4` to the naturally-resolved `9.16.2`: verify via the npm registry that every other wdio-org package this project depends on shows the identical keyid transition at the same version boundary (confirming a coordinated pipeline change, not a takeover), then swap `pnpm-workspace.yaml`'s `trustPolicyExclude`/`overrides` entries accordingly and `pnpm clean --lockfile && pnpm install` to rebuild the lockfile cleanly. - [x] 9.6 Add a `Setup Terraform` step (`hashicorp/setup-terraform`, `terraform_wrapper: false`) to the `test-e2e` job — the first real CI run failed with `lstk tf init`: `terraform not found in PATH`, since unlike Docker, Terraform isn't preinstalled on `ubuntu-latest`. + +## 10. Production Bug Fix: LocalStack Profile Resolution Without `~/.aws/config` + +- [x] 10.1 Fix `AWSConfig.getClientConfig` (`src/platforms/aws/models/awsConfig.ts`) so every LocalStack-managed profile — the default `localstack` profile, not just `localstack#<accountId>` entries — resolves its endpoint and credentials statically (the tracked instance's well-known default endpoint, static credentials keyed by account id), never reading `~/.aws/config`. Discovered via CI/local verification of this change's own demonstration suite: on a machine with no `~/.aws/config` at all, the Resources view showed two duplicate `Profile: localstack` rows, both erroring with real-AWS `CredentialsProviderError`/`InvalidClientTokenId`, because the default profile's identity (`STS.getCallerIdentity`/`IAM.getAccountAlias`, `viewProvider.ts`'s `makeResourceProfiles`) and every resource-listing SDK client (`declarative/engine.ts`) all resolved their client config through the same function, which for the default profile only worked if `~/.aws/config` happened to have a matching `[profile localstack]` section. +- [x] 10.2 Move `DEFAULT_ACCOUNT` from `metamodelFocus.ts` into `awsConfig.ts` (re-exported from there instead) — `metamodelFocus.ts` reaches `awsConfig.ts` transitively through `providerFactory.ts`/`declarative/engine.ts`, so importing it the other way around created an import cycle that `eslint`'s `import/no-cycle` rule caught. +- [x] 10.3 Update/add `AWSConfig` unit tests (`src/test/models/awsConfig.test.ts`) covering the default `localstack` profile's static endpoint/credentials, including explicitly with the config file missing entirely. +- [x] 10.4 Manually re-verify end-to-end: move `~/.aws/config`/`~/.aws/credentials` aside, run `pnpm test:e2e` against a real LocalStack instance, confirm the demonstration suite passes with no AWS configuration present at all, then restore the original files. Passed (`1 passing`, ~2 minutes) under Node 24. diff --git a/src/platforms/aws/models/awsConfig.ts b/src/platforms/aws/models/awsConfig.ts index ca332f9..d253546 100644 --- a/src/platforms/aws/models/awsConfig.ts +++ b/src/platforms/aws/models/awsConfig.ts @@ -6,6 +6,7 @@ import { parse } from "js-ini"; import type { IIniObject, IIniObjectSection } from "js-ini"; import { UserConfigurationError } from "../../../utils/errors.ts"; +import { DEFAULT_ENDPOINT } from "../../../utils/localstack-endpoint.ts"; const DEFAULT_AWS_CONFIG_FILE = path.join(os.homedir(), ".aws", "config"); @@ -15,6 +16,14 @@ const DEFAULT_REGION = "us-east-1"; /** The `~/.aws/config` profile that backs every LocalStack instance/account entry. */ const LOCALSTACK_PROFILE = "localstack"; +/** + * The account every LocalStack instance starts with. Re-exported from + * `metamodelFocus.ts` (which owns the metamodel's account/profile mapping) to + * avoid an import cycle: `metamodelFocus.ts` reaches this module transitively + * through `providerFactory.ts`/`declarative/engine.ts`. + */ +export const DEFAULT_ACCOUNT = "000000000000"; + /** * LocalStack account profile ids beyond the default account take the form * `localstack#<accountId>` (see the `resource-browser` capability's "Select @@ -129,31 +138,34 @@ const AWSConfig = { * here, and the SDK rejects an empty region with "Region is missing". Listing * is unaffected because it always passes the focus region. * - * For a `localstack#<accountId>` profile entry (a non-default LocalStack - * account, see `parseLocalStackAccountId`), static credentials are injected - * using the account id as the access key: LocalStack selects the emulated - * account context from the access key id used for the request, since these - * accounts have no corresponding `~/.aws/config` section of their own. This - * convention is unverified against a live multi-account instance — see - * design.md's Open Questions for `rework-resource-browser-ux`; if it proves - * wrong, non-default-account resource listings should be sourced from the - * metamodel payload directly instead of live SDK calls. + * Every LocalStack-managed profile — the default `localstack` profile or a + * `localstack#<accountId>` account entry (see `parseLocalStackAccountId`) — + * is resolved statically, without reading `~/.aws/config` at all: the + * tracked instance's well-known default endpoint, and credentials using the + * account id as the access key (LocalStack selects the emulated account + * context from the access key id used for the request). This keeps every + * LocalStack SDK call working on a fresh install with no AWS configuration + * present. */ getClientConfig(profile: string, region?: string): object { - /* use endpoint from profile, if it's defined */ - const endpoint = AWSConfig.getEndpointForProfile(profile); const resolvedRegion = region || AWSConfig.getRegionForProfile(profile) || DEFAULT_REGION; - const accountId = parseLocalStackAccountId(profile); + const accountId = + parseLocalStackAccountId(profile) ?? + (profile === LOCALSTACK_PROFILE ? DEFAULT_ACCOUNT : undefined); if (accountId !== undefined) { return { profile: LOCALSTACK_PROFILE, region: resolvedRegion, - endpoint, + endpoint: DEFAULT_ENDPOINT, credentials: { accessKeyId: accountId, secretAccessKey: "test" }, }; } - return { profile, region: resolvedRegion, endpoint }; + return { + profile, + region: resolvedRegion, + endpoint: AWSConfig.getEndpointForProfile(profile), + }; }, /** diff --git a/src/platforms/aws/models/metamodelFocus.ts b/src/platforms/aws/models/metamodelFocus.ts index 788a323..c2e542f 100644 --- a/src/platforms/aws/models/metamodelFocus.ts +++ b/src/platforms/aws/models/metamodelFocus.ts @@ -17,10 +17,9 @@ import { Focus } from "../../../models/focus.ts"; import { ProviderFactory } from "../services/providerFactory.ts"; import { mapLabelToServiceId } from "../services/serviceManifest.ts"; -const METAMODEL_PATH = "/_localstack/pods/state/metamodel"; +import { DEFAULT_ACCOUNT } from "./awsConfig.ts"; -/** The account every LocalStack instance starts with. */ -export const DEFAULT_ACCOUNT = "000000000000"; +const METAMODEL_PATH = "/_localstack/pods/state/metamodel"; /** The LocalStack profile that backs the instance section. */ const LOCALSTACK_PROFILE = "localstack"; diff --git a/src/test/models/awsConfig.test.ts b/src/test/models/awsConfig.test.ts index 6ba8f86..3979427 100644 --- a/src/test/models/awsConfig.test.ts +++ b/src/test/models/awsConfig.test.ts @@ -171,14 +171,36 @@ suite("AWSConfig", () => { ); }); - test("getClientConfig leaves the default localstack profile untouched", () => { + test("getClientConfig uses a fixed endpoint and static credentials for the default localstack profile", () => { assert.deepStrictEqual( AWSConfig.getClientConfig("localstack", "us-east-1"), { profile: "localstack", region: "us-east-1", endpoint: "http://localhost.localstack.cloud:4566", + credentials: { accessKeyId: "000000000000", secretAccessKey: "test" }, }, ); }); + + test("getClientConfig for the default localstack profile does not depend on the config file", () => { + const previous = configHandle.AWS_CONFIG_FILE; + configHandle.AWS_CONFIG_FILE = path.join(tempDir, "does-not-exist"); + try { + assert.deepStrictEqual( + AWSConfig.getClientConfig("localstack", "us-east-1"), + { + profile: "localstack", + region: "us-east-1", + endpoint: "http://localhost.localstack.cloud:4566", + credentials: { + accessKeyId: "000000000000", + secretAccessKey: "test", + }, + }, + ); + } finally { + configHandle.AWS_CONFIG_FILE = previous; + } + }); }); diff --git a/src/utils/localstack-endpoint.ts b/src/utils/localstack-endpoint.ts index 97a03a0..7163796 100644 --- a/src/utils/localstack-endpoint.ts +++ b/src/utils/localstack-endpoint.ts @@ -6,17 +6,19 @@ import { parseIni } from "./ini-parser.ts"; /** * The endpoint used when the `localstack` AWS profile has not been configured * yet. Mirrors the default the configure-aws plugin writes when DNS resolves. + * Also the fixed endpoint `AWSConfig.getClientConfig` uses for LocalStack SDK + * clients, which never consult `~/.aws/config` (see its doc comment). */ -const DEFAULT_ENDPOINT = "http://localhost.localstack.cloud:4566"; +export const DEFAULT_ENDPOINT = "http://localhost.localstack.cloud:4566"; const LOCALSTACK_PROFILE_SECTION = "profile localstack"; /** * Return the endpoint URL the Toolkit is configured to use for the local * emulator. This is the single source of truth shared by the LocalStack - * instance label, the metamodel fetch, and the SDK providers: it reads the - * `localstack` profile's `endpoint_url` from `~/.aws/config`, falling back to - * the Toolkit's default when the profile is not configured. + * instance label and the metamodel fetch: it reads the `localstack` profile's + * `endpoint_url` from `~/.aws/config`, falling back to the Toolkit's default + * when the profile is not configured. */ export async function getLocalStackEndpointUrl(): Promise<string> { try { From 23c931fcd1d1d67c8e11e5d83eb7741f21fbd815 Mon Sep 17 00:00:00 2001 From: Peter Smith <peter.smith@localstack.cloud> Date: Mon, 13 Jul 2026 12:12:01 +1200 Subject: [PATCH 7/7] fix(e2e): retry stale webview reference in readResourceDetails MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first real CI run got past the profile-resolution fix and through three of five Resource Details reads, then hit a stale element reference inside webview.open() — a race between the previous webview's teardown and the next one's creation, only reproducible on CI's Linux/xvfb runner. Retry the whole fetch-then-open cycle instead of just the initial wait. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --- .../add-webdriverio-e2e-testing/design.md | 2 +- .../add-webdriverio-e2e-testing/tasks.md | 1 + test/e2e/specs/resource-browser.e2e.ts | 42 +++++++++++++------ 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/openspec/changes/add-webdriverio-e2e-testing/design.md b/openspec/changes/add-webdriverio-e2e-testing/design.md index cee7599..b0d2d9d 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/design.md +++ b/openspec/changes/add-webdriverio-e2e-testing/design.md @@ -29,7 +29,7 @@ The extension already has one automated test layer: `pnpm test` (`vscode-test` / **Fixture-per-suite Terraform under `test/e2e/fixtures/terraform/<fixture-name>/`, applied/destroyed in `suiteSetup`/`suiteTeardown`.** This demonstration suite's fixture lives at `test/e2e/fixtures/terraform/small-serverless/`, a named subdirectory rather than a single `terraform/main.tf` — future suites are expected to bring their own fixtures under sibling subdirectories (`fixtures/terraform/<other-name>/`), so `lstk.ts`'s `terraformApply`/`terraformDestroy` take a fixture name rather than assuming one fixture for the whole `test/e2e/` tree. Mirrors how a real user would deploy, and keeps the demonstration suite's teardown resilient (`.catch(() => undefined)` on both `terraformDestroy()` and `stop()`) so a failed assertion doesn't leave the emulator running or the fixture's state dangling for the next CI run. -**Poll/retry instead of fixed waits for tree and webview readiness.** VS Code's own tree refresh and the webview's `postMessage` round-trip aren't synchronously observable from WebDriver, so a `waitForResourcesTree` helper uses a bounded retry loop (clicking `Refresh Resources`, backing off 3s→8s between attempts, up to 10 attempts) rather than a fixed sleep, and a `waitForDetailsTable` helper uses `browser.waitUntil` polling for populated `table tr` rows. This avoids both flakiness (fixed short waits) and slow suites (fixed long waits). The demonstration suite closes each webview (`webview.close()`) right after reading it, matching the currently-selected webview via `browser.getWorkbench().getAllWebviews()[0]` rather than by title — the Resource Details webview's HTML has no `<title>`, and since the suite only ever has one webview open at a time, matching by position is sufficient. +**Poll/retry instead of fixed waits for tree and webview readiness.** VS Code's own tree refresh and the webview's `postMessage` round-trip aren't synchronously observable from WebDriver, so a `waitForResourcesTree` helper uses a bounded retry loop (clicking `Refresh Resources`, backing off 3s→8s between attempts, up to 10 attempts) rather than a fixed sleep, and a `waitForDetailsTable` helper uses `browser.waitUntil` polling for populated `table tr` rows. This avoids both flakiness (fixed short waits) and slow suites (fixed long waits). The demonstration suite closes each webview (`webview.close()`) right after reading it, matching the currently-selected webview via `browser.getWorkbench().getAllWebviews()[0]` rather than by title — the Resource Details webview's HTML has no `<title>`, and since the suite only ever has one webview open at a time, matching by position is sufficient. `readResourceDetails` retries the whole fetch-then-`.open()` cycle (up to 3 attempts, re-fetching a fresh webview reference each time) rather than just the initial wait: the first real CI run got past the profile-resolution bug fix above and through three of five Resource Details reads, then failed with `stale element reference` inside `webview.open()` on the fourth — a race between the previous webview's teardown and the next one's creation, reproducible on CI's Linux/xvfb runner but never seen locally on macOS. **Mocha `ui: "tdd"`, matching `src/test/**`'s existing style**, so `suite`/`test`/`suiteSetup`/`suiteTeardown` read the same across both suite types. Test timeout set generously (5 minutes) because the suite shells out to `lstk start` and `lstk tf apply`, both real wall-clock operations against a real emulator, not mocks. diff --git a/openspec/changes/add-webdriverio-e2e-testing/tasks.md b/openspec/changes/add-webdriverio-e2e-testing/tasks.md index 7543f92..35b15c9 100644 --- a/openspec/changes/add-webdriverio-e2e-testing/tasks.md +++ b/openspec/changes/add-webdriverio-e2e-testing/tasks.md @@ -69,3 +69,4 @@ - [x] 10.2 Move `DEFAULT_ACCOUNT` from `metamodelFocus.ts` into `awsConfig.ts` (re-exported from there instead) — `metamodelFocus.ts` reaches `awsConfig.ts` transitively through `providerFactory.ts`/`declarative/engine.ts`, so importing it the other way around created an import cycle that `eslint`'s `import/no-cycle` rule caught. - [x] 10.3 Update/add `AWSConfig` unit tests (`src/test/models/awsConfig.test.ts`) covering the default `localstack` profile's static endpoint/credentials, including explicitly with the config file missing entirely. - [x] 10.4 Manually re-verify end-to-end: move `~/.aws/config`/`~/.aws/credentials` aside, run `pnpm test:e2e` against a real LocalStack instance, confirm the demonstration suite passes with no AWS configuration present at all, then restore the original files. Passed (`1 passing`, ~2 minutes) under Node 24. +- [x] 10.5 Push the fix and re-run CI. The profile-resolution bug fix confirmed working — CI got past the previous run's `region "us-east-1" not present yet` failure entirely, through tree assertions and three of five Resource Details reads — but then hit a new, CI-only `stale element reference` failure inside `readResourceDetails`'s `webview.open()`. Fixed by retrying the whole fetch-then-open cycle instead of just the initial wait (see design.md). Re-verified locally and re-pushed; task 8.3 (CI passing) now unblocked. diff --git a/test/e2e/specs/resource-browser.e2e.ts b/test/e2e/specs/resource-browser.e2e.ts index 1fab7cb..f9a0155 100644 --- a/test/e2e/specs/resource-browser.e2e.ts +++ b/test/e2e/specs/resource-browser.e2e.ts @@ -349,19 +349,35 @@ async function readResourceDetails( const workbench = await browser.getWorkbench(); // Resource Details' webview HTML has no <title>, so it can't be matched by // title (document.title is empty); it's the only webview in this scenario, - // so just wait for one to exist. - const webview = await browser.waitUntil<WebView | undefined>( - async () => { - const webviews = await workbench.getAllWebviews(); - return webviews[0]; - }, - { - timeout: 15_000, - interval: 500, - timeoutMsg: '"Resource Details" webview never appeared', - }, - ); - await webview.open(); + // so just wait for one to exist. The whole fetch-then-open cycle is retried + // (not just the initial wait): occasionally the fetched reference goes + // stale by the time `.open()` runs — the previous webview's teardown + // racing this one's creation — so on failure a fresh reference is + // re-fetched rather than retrying `.open()` on the same stale one. + let webview: WebView | undefined; + let lastError: unknown; + for (let attempt = 0; attempt < 3 && !webview; attempt++) { + const candidate = await browser.waitUntil<WebView | undefined>( + async () => { + const webviews = await workbench.getAllWebviews(); + return webviews[0]; + }, + { + timeout: 15_000, + interval: 500, + timeoutMsg: '"Resource Details" webview never appeared', + }, + ); + try { + await candidate.open(); + webview = candidate; + } catch (error) { + lastError = error; + } + } + if (!webview) { + throw lastError; + } try { return await waitForDetailsTable(); } finally {