diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index bc98102d6..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "jdwlabs-apps", - "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", - "features": { - "ghcr.io/devcontainers/features/node:1": { - "version": "22" - }, - "ghcr.io/devcontainers/features/go:1": { - "version": "1.23" - }, - "ghcr.io/devcontainers/features/java:1": { - "version": "21", - "jdkDistro": "ms" - } - }, - "postCreateCommand": "npm ci", - "customizations": { - "vscode": { - "extensions": [ - "angular.ng-template", - "nrwl.angular-console", - "golang.go", - "vscjava.vscode-java-pack", - "redhat.vscode-yaml" - ] - } - } -} diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index ffd63f7ca..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,9 +0,0 @@ -# Last matching pattern wins; keep the catch-all first. -* @jdwillmsen - -# CI/CD workflows control release and delivery; changes need owner review. -/.github/workflows/ @jdwillmsen - -# Shared libraries fan out to every app that consumes them. -/libs/backend/ @jdwillmsen -/libs/frontend/ @jdwillmsen diff --git a/.github/rulesets/apply.sh b/.github/rulesets/apply.sh deleted file mode 100755 index bb2603468..000000000 --- a/.github/rulesets/apply.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash -# Applies the ruleset exports in this directory to GitHub. -# -# Rulesets are managed as code here: edit the JSON, merge via PR, then run -# this script. Requires gh (authenticated with admin on the repo) and jq. -# -# ./apply.sh # apply every *.json in this directory -# ./apply.sh --dry-run # print what would change without writing -# -# Re-export after any out-of-band UI change with: -# gh api repos/jdwlabs/apps/rulesets/ | jq . > .json -# -# Matching is by the "id" field embedded in each export: if that id still -# exists live, the ruleset is updated in place (PUT); otherwise it is -# recreated (POST) — re-export afterwards so the file carries the new id. - -set -euo pipefail - -REPO="jdwlabs/apps" -DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -DRY_RUN="${1:-}" - -count=0 -for file in "$DIR"/*.json; do - name=$(jq -r '.name' "$file") - id=$(jq -r '.id // empty' "$file") - # Strip read-only fields the API rejects or ignores on write. - payload=$(jq 'del(.id, .node_id, .source, .source_type, .created_at, .updated_at, .current_user_can_bypass, ._links)' "$file") - - if [ -n "$id" ] && gh api "repos/$REPO/rulesets/$id" >/dev/null 2>&1; then - method="PUT"; endpoint="repos/$REPO/rulesets/$id" - else - method="POST"; endpoint="repos/$REPO/rulesets" - fi - - if [ "$DRY_RUN" = "--dry-run" ]; then - echo "would $method $endpoint ($name from ${file##*/})" - else - printf '%s' "$payload" | gh api -X "$method" "$endpoint" --input - >/dev/null - echo "$method $endpoint ($name from ${file##*/})" - fi - count=$((count + 1)) -done - -echo "done: $count ruleset file(s) processed for $REPO" diff --git a/.github/rulesets/baseline.json b/.github/rulesets/baseline.json deleted file mode 100644 index 9ed779800..000000000 --- a/.github/rulesets/baseline.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "id": 17653721, - "name": "Baseline", - "target": "branch", - "source_type": "Repository", - "source": "jdwlabs/apps", - "enforcement": "active", - "conditions": { - "ref_name": { - "exclude": [], - "include": ["refs/heads/main"] - } - }, - "rules": [ - { - "type": "pull_request", - "parameters": { - "required_approving_review_count": 1, - "dismiss_stale_reviews_on_push": true, - "required_reviewers": [], - "require_code_owner_review": false, - "dismissal_restriction": { - "enabled": false, - "allowed_actors": [] - }, - "require_last_push_approval": false, - "required_review_thread_resolution": false, - "allowed_merge_methods": ["merge", "squash", "rebase"] - } - }, - { - "type": "deletion" - }, - { - "type": "non_fast_forward" - }, - { - "type": "required_linear_history" - }, - { - "type": "required_status_checks", - "parameters": { - "strict_required_status_checks_policy": true, - "do_not_enforce_on_create": false, - "required_status_checks": [ - { - "context": "main" - } - ] - } - } - ], - "node_id": "RRS_lACqUmVwb3NpdG9yec5IdNdpzgENX9k", - "created_at": "2026-06-13T23:42:06.412-05:00", - "updated_at": "2026-07-05T20:00:58.125-05:00", - "bypass_actors": [ - { - "actor_id": null, - "actor_type": "OrganizationAdmin", - "bypass_mode": "always" - }, - { - "actor_id": 4065387, - "actor_type": "Integration", - "bypass_mode": "always" - } - ], - "current_user_can_bypass": "always", - "_links": { - "self": { - "href": "https://api.github.com/repos/jdwlabs/apps/rulesets/17653721" - }, - "html": { - "href": "https://github.com/jdwlabs/apps/rules/17653721" - } - } -} diff --git a/.github/rulesets/branch-naming-convention.json b/.github/rulesets/branch-naming-convention.json deleted file mode 100644 index 76f28e7e4..000000000 --- a/.github/rulesets/branch-naming-convention.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "id": 17653725, - "name": "Branch Naming Convention", - "target": "branch", - "source_type": "Repository", - "source": "jdwlabs/apps", - "enforcement": "active", - "conditions": { - "ref_name": { - "exclude": ["refs/heads/main", "refs/heads/gh-pages"], - "include": ["refs/heads/**"] - } - }, - "rules": [ - { - "type": "branch_name_pattern", - "parameters": { - "operator": "regex", - "pattern": "^(feat|fix|hotfix|release|chore|docs|refactor|test|ci)/.+", - "negate": false, - "name": "Conventional prefixes" - } - } - ], - "node_id": "RRS_lACqUmVwb3NpdG9yec5IdNdpzgENX90", - "created_at": "2026-06-13T23:42:06.434-05:00", - "updated_at": "2026-06-13T23:42:06.461-05:00", - "bypass_actors": [ - { - "actor_id": null, - "actor_type": "OrganizationAdmin", - "bypass_mode": "always" - } - ], - "current_user_can_bypass": "always", - "_links": { - "self": { - "href": "https://api.github.com/repos/jdwlabs/apps/rulesets/17653725" - }, - "html": { - "href": "https://github.com/jdwlabs/apps/rules/17653725" - } - } -} diff --git a/.github/rulesets/release-tag-protection.json b/.github/rulesets/release-tag-protection.json deleted file mode 100644 index 41feb5eae..000000000 --- a/.github/rulesets/release-tag-protection.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "id": 17653723, - "name": "Release Tag Protection", - "target": "tag", - "source_type": "Repository", - "source": "jdwlabs/apps", - "enforcement": "active", - "conditions": { - "ref_name": { - "exclude": [], - "include": ["refs/tags/v*", "refs/tags/*-v*"] - } - }, - "rules": [ - { - "type": "deletion" - }, - { - "type": "non_fast_forward" - } - ], - "node_id": "RRS_lACqUmVwb3NpdG9yec5IdNdpzgENX9s", - "created_at": "2026-06-13T23:42:06.426-05:00", - "updated_at": "2026-06-13T23:42:06.443-05:00", - "bypass_actors": [ - { - "actor_id": null, - "actor_type": "OrganizationAdmin", - "bypass_mode": "always" - } - ], - "current_user_can_bypass": "always", - "_links": { - "self": { - "href": "https://api.github.com/repos/jdwlabs/apps/rulesets/17653723" - }, - "html": { - "href": "https://github.com/jdwlabs/apps/rules/17653723" - } - } -} diff --git a/.github/workflows/arc-test-matrix-workflow.yml b/.github/workflows/arc-test-matrix-workflow.yml index 1e96ff5ed..a93c82b6b 100644 --- a/.github/workflows/arc-test-matrix-workflow.yml +++ b/.github/workflows/arc-test-matrix-workflow.yml @@ -19,5 +19,5 @@ jobs: redis: image: redis:alpine steps: - - uses: actions/checkout@v6.0.3 + - uses: actions/checkout@v3 - run: echo "Hello World!" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/backfill-ui-images.yml b/.github/workflows/backfill-ui-images.yml deleted file mode 100644 index 9279fb460..000000000 --- a/.github/workflows/backfill-ui-images.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Backfill UI images to jdwlabs namespace - -# One-shot manual backfill. The Nx affected-only build never republished the -# four UI apps under jdwlabs/* (they were unchanged since the namespace switch), -# so their charts in deployments/ would ImagePullBackOff once repointed. -# imagetools does a registry-to-registry manifest copy: no rebuild, no layer -# pull/push, source digests preserved. Pairs default to the tags currently -# deployed in jdwlabs-prd/non; override to backfill other tags later. -on: - workflow_dispatch: - inputs: - pairs: - description: 'Space-separated app:tag list copied jdwillmsen/jdw- -> jdwlabs/' - required: true - default: 'authui:2.0.1 container:1.4.1 rolesui:0.5.4 usersui:1.3.5' - -# Job authenticates to Docker Hub via secrets and never touches GITHUB_TOKEN. -permissions: {} - -jobs: - backfill: - runs-on: ubuntu-latest - steps: - - name: Log in to Docker Hub - uses: docker/login-action@v4.2.0 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - - name: Copy images - run: | - set -euo pipefail - for pair in ${{ inputs.pairs }}; do - app="${pair%%:*}" - tag="${pair##*:}" - src="jdwillmsen/jdw-${app}:${tag}" - dst="jdwlabs/${app}:${tag}" - echo "::group::${src} -> ${dst}" - docker buildx imagetools create -t "${dst}" "${src}" - docker buildx imagetools inspect "${dst}" --format '{{.Manifest.Digest}}' - echo "::endgroup::" - done diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ad041d61..a589c7a96 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,312 +7,81 @@ on: pull_request: workflow_dispatch: -# No default permissions: release/deliver/dispatch-e2e authenticate via a -# GitHub App token (create-github-app-token), not the default GITHUB_TOKEN, so -# they don't need it. Each job below grants only what its own steps use. -permissions: {} - -# Cancel superseded PR runs; a main-push always runs quality gates to completion. -concurrency: - group: ci-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.event_name == 'pull_request' }} +permissions: + actions: write + contents: write env: + NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true - # Ephemeral CI runners: no daemon to reuse, and a lingering daemon is what hangs - # @nx/gradle graph creation. Run gradle one-shot. - NX_DAEMON: 'false' - GRADLE_OPTS: '-Dorg.gradle.daemon=false' - # @nx/gradle generates the project graph by invoking gradle with a 120s default - # timeout. A cold gradle (dist download + full Spring Boot dep resolution) can - # exceed it, failing the whole graph. Raise it so a cold run can complete and - # seed the gradle cache. The Warm Gradle step below makes the steady state fast. - NX_GRADLE_PROJECT_GRAPH_TIMEOUT: '600' jobs: main: - # Release postTargets push chore commits back to main authenticated as the - # release App — those pushes DO trigger workflows (App tokens bypass the - # GITHUB_TOKEN recursion suppression). Without this guard the pipeline - # re-versions the just-released projects forever: the conventionalcommits - # preset patch-bumps on any commit, including the release's own chore - # commits — producing an endless ~5-minute release loop. - if: ${{ github.event_name != 'push' || github.triggering_actor != 'jdwlabs-release-bot[bot]' }} - runs-on: ubuntu-latest - # Fail fast: cap runtime so a stuck/looping job can't burn the Actions budget. + runs-on: ubuntu-jdwlabs + # Fail fast: a stuck/looping job otherwise runs to the 6h platform cap, + # starving the self-hosted runner queue for other PRs. timeout-minutes: 30 - permissions: - contents: read - # actions/cache's save step (post-job) needs this to write the cache entry. - actions: write + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} steps: - name: Checkout Codebase - uses: actions/checkout@v6.0.3 + uses: actions/checkout@v4 with: fetch-depth: 0 - token: ${{ github.token }} - # JDK must exist before the first nx command: @nx/gradle (apps/backend/**) - # shells out to gradle 8.7 to build the project graph, and usersrole targets - # Java 21. Without this, gradle stalls provisioning a toolchain — the cause - # of the ~11-min "Failed to process project graph" hang. - - name: Setup Java - uses: actions/setup-java@v5.2.0 - with: - distribution: temurin - java-version: '21' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6.2.0 - # Pre-warm gradle (download dist + resolve deps) so the later @nx/gradle - # graph generation is ~1s instead of timing out cold. Seeds the gradle - # cache; near-instant once the cache is warm. - - name: Warm Gradle - working-directory: apps/backend/usersrole - run: ./gradlew help -q + # This line enables distribution + # The "--stop-agents-after" is optional, but allows idle agents to shut down once the "e2e-ci" targets have been requested + # - name: Enable NX Cloud Distribution + # run: pnpm exec nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" - name: Setup pnpm - uses: pnpm/action-setup@v6.0.9 - - name: Setup Node - uses: actions/setup-node@v6.4.0 - with: - node-version: '22' - cache: pnpm + uses: pnpm/action-setup@v4 - name: Install Dependencies run: pnpm install --frozen-lockfile - # Persist Nx's task cache across runs via the GitHub Actions cache. The - # run_id suffix always writes a fresh entry; restore-keys pull the most - # recent prior cache. GitHub scopes caches per branch, so a PR can't poison - # main's cache (the CREEP class of issue with shared remote caches). - - name: Restore Nx cache - uses: actions/cache@v5.0.5 - with: - path: .nx/cache - key: nx-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ github.run_id }} - restore-keys: | - nx-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}- - nx-${{ runner.os }}- - name: Setup Base and SHAs for 'nx affected' - uses: nrwl/nx-set-shas@v5.0.1 + uses: nrwl/nx-set-shas@v4 - if: ${{ github.event_name == 'pull_request' }} name: Setup Main Branch Tracking run: git branch --track main origin/main - - if: ${{ github.event_name == 'pull_request' && github.actor != 'dependabot[bot]' }} + - if: ${{ github.event_name == 'pull_request' }} name: Validate Commit Messages run: pnpm exec commitlint --from=${{ github.event.pull_request.base.sha }} --to=${{ github.event.pull_request.head.sha }} - name: Run Format Check - # --all checks the whole repo, not just affected files. Without it the - # scope tracks git context (PR diff vs push range), so a repo-wide - # formatting violation in a file the change doesn't touch passes the PR - # gate yet fails on main-push — a green PR no longer implies a green main. - run: pnpm exec nx format:check --all + run: pnpm exec nx-cloud record -- nx format:check + - name: Reset NX + run: pnpm exec nx reset - name: Run Linting & Unit Tests run: pnpm exec nx affected -t lint test - name: Run Build run: pnpm exec nx affected -t build - - if: ${{ github.event_name == 'pull_request' }} - name: Release Config Dry Run - env: - # Dry-run still reads the GitHub API while previewing release notes; - # unauthenticated calls from shared runner IPs get rate-limited (403). - GITHUB_TOKEN: ${{ github.token }} - run: pnpm exec nx release --dry-run --skip-publish - - release: - needs: main - if: ${{ github.event_name == 'push' && github.triggering_actor != 'jdwlabs-release-bot[bot]' }} - runs-on: ubuntu-latest - timeout-minutes: 20 - # Serialize racing merges: nx release must never push onto a moved main tip. - concurrency: - group: release-main - cancel-in-progress: false - permissions: - contents: read - outputs: - matrix: ${{ steps.released.outputs.matrix }} - sha: ${{ steps.released.outputs.sha }} - steps: - - name: Generate release app token - id: release-token - uses: actions/create-github-app-token@v3.2.0 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - - name: Checkout Codebase - uses: actions/checkout@v6.0.3 - with: - fetch-depth: 0 - token: ${{ steps.release-token.outputs.token }} - # Don't leave the repo-write App token sitting in .git/config through - # Java/Gradle setup and pnpm install (dependency lifecycle scripts run - # with whatever's on disk). Re-authenticate immediately before the - # step that actually needs to push. - persist-credentials: false - - name: Setup Java - uses: actions/setup-java@v5.2.0 - with: - distribution: temurin - java-version: '21' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6.2.0 - - name: Warm Gradle - working-directory: apps/backend/usersrole - run: ./gradlew help -q - - name: Setup pnpm - uses: pnpm/action-setup@v6.0.9 - - name: Setup Node - uses: actions/setup-node@v6.4.0 - with: - node-version: '22' - cache: pnpm - - name: Install Dependencies - run: pnpm install --frozen-lockfile - - name: Authenticate Remote For Release Push - # persist-credentials: false above kept this token off disk until now; - # inject it right before the step that actually needs to push. - run: | - git remote set-url origin "https://x-access-token:${{ steps.release-token.outputs.token }}@github.com/${{ github.repository }}.git" - - name: Run Nx Release - env: - # Nx creates the GitHub Releases via this token after pushing tags. - GITHUB_TOKEN: ${{ steps.release-token.outputs.token }} - run: | - git config --global user.email "actions@github.com" - git config --global user.name "github-actions[bot]" - # Version against the live remote tip so tags always land on the - # commit that becomes main (same rationale as the previous pipeline). - git fetch origin main --tags --prune --force - git checkout -B main origin/main - pnpm exec nx release --skip-publish - - name: Determine Released Projects - id: released - run: | - sha=$(git rev-parse HEAD) - tags=$(git tag --points-at "$sha") - if [ -z "$tags" ]; then - echo "No projects released." - matrix='[]' - else - projects=$(printf '%s\n' "$tags" \ - | sed -nE 's/^(.+)-([0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.]+)?)$/\1 \2/p') - echo "Released: $tags" - entries='[]' - while read -r project version; do - [ -z "$project" ] && continue - # Detect delivery targets here (graph already built for this job) - # instead of every deliver matrix job separately installing - # Java+Gradle+pnpm solely to run this same lookup. - available=$(pnpm exec nx show project "$project" --json | jq -r '.targets | keys | join(" ")') - entry=$(jq -n \ - --arg project "$project" \ - --arg version "$version" \ - --argjson buildImage "$(case " $available " in *' build-image '*) echo true;; *) echo false;; esac)" \ - --argjson updateApp "$(case " $available " in *' update-app '*) echo true;; *) echo false;; esac)" \ - --argjson updateDescription "$(case " $available " in *' update-description '*) echo true;; *) echo false;; esac)" \ - '{project: $project, version: $version, "build-image": $buildImage, "update-app": $updateApp, "update-description": $updateDescription}') - entries=$(printf '%s\n%s' "$entries" "$entry" | jq -sc 'flatten') - done <<< "$projects" - matrix="$entries" - fi - echo "matrix=$matrix" >> "$GITHUB_OUTPUT" - echo "sha=$sha" >> "$GITHUB_OUTPUT" - - deliver: - needs: release - if: ${{ needs.release.outputs.matrix != '[]' }} - runs-on: ubuntu-latest - timeout-minutes: 30 - permissions: - contents: read - strategy: - fail-fast: false - matrix: - include: ${{ fromJSON(needs.release.outputs.matrix) }} - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} - steps: - - name: Checkout Release Commit - uses: actions/checkout@v6.0.3 - with: - ref: ${{ needs.release.outputs.sha }} - - name: Setup Java - uses: actions/setup-java@v5.2.0 - with: - distribution: temurin - java-version: '21' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6.2.0 - - name: Warm Gradle - working-directory: apps/backend/usersrole - run: ./gradlew help -q - - name: Setup pnpm - uses: pnpm/action-setup@v6.0.9 - - name: Setup Node - uses: actions/setup-node@v6.4.0 - with: - node-version: '22' - cache: pnpm - - name: Install Dependencies - run: pnpm install --frozen-lockfile - # Delivery targets (build-image/update-app/update-description) were - # already detected once in the release job and embedded in this matrix - # entry (matrix.build-image etc) — no need for every matrix job here to - # redo the same `nx show project` lookup. - - if: ${{ matrix['build-image'] == true }} + - if: ${{ github.event_name != 'pull_request' }} name: Login to Docker Hub - uses: docker/login-action@v4.2.0 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - - if: ${{ matrix['build-image'] == true }} - name: Set up QEMU - uses: docker/setup-qemu-action@v4.1.0 - - if: ${{ matrix['build-image'] == true }} + - if: ${{ github.event_name != 'pull_request' }} + name: Setup SSH + uses: MrSquaare/ssh-setup-action@v3 + with: + host: github.com + private-key: ${{ secrets.ACTIONS_PRIVATE_KEY }} + - if: ${{ github.event_name != 'pull_request' }} name: Set up Docker Buildx - uses: docker/setup-buildx-action@v4.1.0 + uses: docker/setup-buildx-action@v3 with: - driver: 'docker-container' + driver: 'kubernetes' + driver-opts: | + qemu.install=true platforms: 'linux/amd64,linux/arm64' - - if: ${{ matrix['build-image'] == true }} - name: Build and Push Image - env: - PROJECT: ${{ matrix.project }} - run: pnpm exec nx run "$PROJECT":build-image - - if: ${{ matrix['update-app'] == true }} - name: Update Deployments Chart - env: - PROJECT: ${{ matrix.project }} - GH_APP_ID: ${{ secrets.RELEASE_APP_ID }} - GH_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} + - if: ${{ github.event_name != 'pull_request' }} + name: Run Version Upgrades run: | git config --global user.email "actions@github.com" git config --global user.name "github-actions[bot]" - pnpm exec nx run "$PROJECT":update-app - - if: ${{ matrix['update-description'] == true }} - name: Update Docker Hub Description - env: - PROJECT: ${{ matrix.project }} - run: pnpm exec nx run "$PROJECT":update-description + pnpm exec nx affected -t version --parallel=1 - dispatch-e2e: - needs: [release, deliver] - if: ${{ needs.release.outputs.matrix != '[]' && needs.deliver.result == 'success' }} - runs-on: ubuntu-latest - timeout-minutes: 5 - permissions: {} - steps: - - name: Generate deployments dispatch token - id: dispatch-token - uses: actions/create-github-app-token@v3.2.0 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - owner: ${{ github.repository_owner }} - repositories: deployments - permission-contents: write - - name: Dispatch E2E to Deployments Repo - uses: peter-evans/repository-dispatch@v4.0.1 - with: - token: ${{ steps.dispatch-token.outputs.token }} - repository: jdwlabs/deployments - event-type: apps-deployed - client-payload: '{"sha": "${{ needs.release.outputs.sha }}"}' + # Self-heal can loop indefinitely on a hard failure; cap it so it can't + # consume the whole job budget. + - run: npx nx fix-ci + if: always() + timeout-minutes: 10 diff --git a/.github/workflows/security-scan.yml b/.github/workflows/security-scan.yml deleted file mode 100644 index 4de668ff2..000000000 --- a/.github/workflows/security-scan.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Security Scan - -on: - pull_request: - push: - branches: [main] - -permissions: - contents: read - security-events: write - -jobs: - scan: - uses: jdwlabs/.github/.github/workflows/security-scan.yml@main - # Trivy findings are non-blocking: they surface in the Security tab - # without gating merges. Flip fail-on-findings to true once the finding - # volume across all repos has been triaged as real signal, not noise. - # The gitleaks secrets gate inside the reusable workflow always blocks. diff --git a/.gitignore b/.gitignore index 14ee09027..818bdf1ae 100644 --- a/.gitignore +++ b/.gitignore @@ -48,13 +48,4 @@ Thumbs.db .nx/self-healing # Local planning docs (specs, design docs — not for version control) -docs/superpowers/ - -# Secrets — local credentials must never be committed -.env* -*.key -*.pem -kubeconfig* -*.kubeconfig -# Go sources named kubeconfig*.go (backend services) are code, not credentials -!kubeconfig*.go \ No newline at end of file +docs/superpowers/ \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index f9bebea00..bcb2533b9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,5 +5,4 @@ tsconfig.base.json /.nx/workspace-data .nx/self-healing -pnpm-lock.yaml -LICENSE.md +pnpm-lock.yaml \ No newline at end of file diff --git a/AGENT.md b/AGENT.md index 1d72d97a1..bf435afe2 100644 --- a/AGENT.md +++ b/AGENT.md @@ -1,5 +1,65 @@ -# AGENT.md +# AGENT.md — jdwlabs/apps Monorepo -Agent instructions for tools that read `AGENT.md`. +Agent instructions for OpenAI Codex, Gemini, GitHub Copilot, and other AI coding agents. +Claude Code users: see `CLAUDE.md`. -The canonical agent instructions live in [AGENTS.md](AGENTS.md) — that file is the single source of truth. Do not add repo guidance here; edit AGENTS.md instead. +## Safe to Run Autonomously + +```bash +pnpm exec nx affected -t lint test # run affected lint + tests +pnpm exec nx format:check # check formatting +pnpm exec nx format:write # fix formatting +pnpm exec nx run : # run any build/lint/test target +pnpm exec nx reset # clear Nx cache +pnpm exec nx show projects # list all projects +docker compose -f scripts/docker/compose.yaml up -d # start local stack +``` + +## Requires Confirmation Before Running + +- `git push` — always confirm destination branch +- `pnpm exec nx affected -t version` — triggers Docker builds and semver tags +- `docker buildx build --push` — pushes to DockerHub +- Any `git reset`, `git rebase`, or `git push --force` +- Changes to `.github/workflows/ci.yml` + +## Never Run + +- `git push --force origin main` +- `git commit --no-verify` +- `npm install` or `yarn` — this project uses **pnpm** only + +## Repository Layout + +``` +apps/angular/ Angular apps: authui, container, rolesui, usersui +apps/go/ Go services: servicediscovery +apps/springboot/ Spring Boot: usersrole +apps/database/ PostgreSQL: authdb +libs/angular/ Shared Angular libs (per-app + shared) +libs/go/ Go shared packages +tools/agents/ Docker dev agent (do not modify structure) +scripts/ Shell helpers and Docker Compose +``` + +## Commit Format + +`(): ` + +Types: feat fix chore docs style refactor perf test build ci revert +Scope: kebab-case (optional but encouraged) +Subject: lowercase, no trailing period, max 100 chars + +## Module Boundary Rules + +Angular libs are tag-scoped. A `scope:container` lib may only import from `scope:container` or `scope:shared` libs. Cross-scope imports will fail ESLint lint. See `eslint.config.ts` `depConstraints` for the full ruleset. + +## Testing + +- Unit tests: Jest (`pnpm exec nx run :test`) +- E2E: Playwright in `apps/angular/platform-e2e` (`pnpm exec nx run platform-e2e:e2e`) +- No mocking of Nx project graph or module boundaries in tests + +## Versioning + +`@jscutlery/semver` manages versioning via conventional commits. Do not manually edit `version.json`, `Chart.yaml` appVersion, or `build.gradle.kts` version — these are auto-updated by CI. diff --git a/AGENTS.md b/AGENTS.md index eb3cf615c..81f9e92c2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,165 +1,37 @@ # AGENTS.md -Canonical context for AI agents (Claude Code, OpenAI Codex, Gemini CLI, GitHub Copilot, and others) working in this repository. `CLAUDE.md`, `GEMINI.md`, and `AGENT.md` are thin pointers to this file — make edits here. +Context for AI agents (OpenAI Codex, GitHub Copilot, and others) working in this repository. ## What This Repo Is -jdwlabs `apps` is an Nx 22 monorepo containing the full application stack for the jdwlabs platform. Angular 21 micro-frontends, Go services, a Spring Boot/Kotlin service, PostgreSQL migration runners, and shared libraries. Package manager is **pnpm 10**. CI runs on GitHub-hosted runners (`ubuntu-latest`). +jdwlabs `apps` is an NX monorepo containing the full application stack for the jdwlabs platform: -- **Auth UI** (`apps/frontend/authui`) — login, registration, session management -- **Roles UI** (`apps/frontend/rolesui`) — role assignment and management -- **Users UI** (`apps/frontend/usersui`) — user listing and administration -- **Container** (`apps/frontend/container`) — shell app that composes micro-frontends via Module Federation -- **Platform E2E** (`apps/e2e/platform-e2e`) — Playwright end-to-end test suite -- **Service Discovery** (`apps/backend/servicediscovery`) — Go backend service registry -- **AI-SRE Relay** (`apps/backend/ai-sre-relay`) — Go alert-relay service for the AI-SRE stack -- **Users/Role service** (`apps/backend/usersrole`) — Spring Boot/Kotlin user-role assignment API +- **Auth UI** (`apps/angular/authui`) — login, registration, session management +- **Roles UI** (`apps/angular/rolesui`) — role assignment and management +- **Users UI** (`apps/angular/usersui`) — user listing and administration +- **Container** (`apps/angular/container`) — shell app that composes micro-frontends via Module Federation +- **Platform E2E** (`apps/angular/platform-e2e`) — Cypress end-to-end test suite +- **Service Discovery** (`apps/go/servicediscovery`) — Go backend service registry +- **Users/Role service** (`apps/springboot/usersrole`) — Spring Boot/Kotlin user-role assignment API - **Auth DB** (`apps/database/authdb`) — database migration management -## Directory Map - -``` -apps/ - frontend/ # Angular micro-frontend apps (authui, container, rolesui, usersui) - backend/ # Go (servicediscovery, ai-sre-relay) + Spring Boot (usersrole) services - database/ # DB migration runners (authdb — PostgreSQL) - e2e/ # Playwright E2E tests (platform-e2e) -libs/ - frontend/ # Shared Angular libs (per-app: authui/container/rolesui/usersui + shared) - backend/ # Go shared packages -tools/ - agents/ # Nx-adjacent Docker dev agent — DO NOT move or restructure - release/ # Custom nx release version actions - testing/ # Shared test tooling -scripts/ # Non-Nx shell scripts and Docker Compose helpers - docker/ # docker/compose.yaml — local dev stack -docs/ # architecture, conventions, workflows, onboarding -``` - ## Key Concepts -- **Module Federation:** frontends are micro-frontends composed at runtime via Webpack Module Federation — each Angular app is independently deployable but the `container` app assembles them +- **Module Federation:** frontends are micro-frontends composed at runtime via Webpack Module Federation — each Angular app is independently deployable but the container app assembles them - **NX affected:** CI only builds/tests code touched by a PR — understand the dependency graph before assuming a change is isolated (`npx nx graph` to visualize) -- **go.work:** a Go workspace at the repo root covers `apps/backend/servicediscovery`, `apps/backend/ai-sre-relay`, and `libs/backend/shared/util` — always run `go` commands from the repo root - -## Worktree Location (Windows — CRITICAL) - -This repo lives on **F: drive** (`F:\Dev\projects\personal\jdwlabs\apps`). -**Worktrees MUST be created on the same drive (F:).** - -pnpm uses hard links for its content-addressable store. Hard links cannot cross NTFS volume boundaries. If a worktree is on C: and the repo is on F:, `pnpm install` will silently succeed but produce an empty `node_modules` (only `.pnpm` dir) — no binaries, no hoisted packages. Git hooks that call `npx --no-install ` will then fail. - -```bash -# CORRECT — same drive as repo -git worktree add F:/Dev/worktrees/apps/feat/my-feature -b feat/my-feature -``` - -If a cross-drive worktree left `node_modules` with only `.pnpm` and no `.bin`, replace it with a junction to the main repo's `node_modules`: - -```powershell -Remove-Item -Recurse -Force C:\path\to\worktree\node_modules -New-Item -ItemType Junction -Path C:\path\to\worktree\node_modules -Target F:\Dev\projects\personal\jdwlabs\apps\node_modules -``` - -## Key Commands - -```bash -pnpm exec nx affected -t lint test # affected lint + tests (use during development) -pnpm exec nx format:check # check formatting (must pass in CI) -pnpm exec nx format:write # fix formatting -pnpm exec nx run : # run any build/lint/test target -pnpm exec nx reset # clear Nx cache (required after editing project.json) -pnpm exec nx show projects # list all projects -pnpm run commit # interactive commit (commitizen) -docker compose -f scripts/docker/compose.yaml up -d # start local stack -go build ./... && go test ./... # Go workspace build/test (from repo root) -``` - -## Nx Project Tags - -Every `project.json` has three tag families: - -- `type:app` | `type:lib` | `type:e2e` | `type:feature` | `type:ui` | `type:data-access` | `type:util` -- `scope:` — app-level scope; names come from `project.json` files. Run `pnpm exec nx show projects` for the current list. -- `framework:angular` | `framework:go` | `framework:springboot` | `framework:database` | `framework:playwright` - -Module boundary rules in `eslint.config.ts` enforce: - -- Per-app-scope isolation: a `scope:X` lib may only import from `scope:X` or `scope:shared` libs -- Framework isolation: `framework:angular` libs may only import from other `framework:angular` libs -- Type hierarchy: `type:feature` → `type:ui` + `type:util` + `type:data-access` (no circular) - -## Angular Architecture - -Four Angular apps use **webpack module federation**: - -- `container` — shell app, loads remotes at runtime -- `authui`, `rolesui`, `usersui` — remote apps - -Each app has libs under `libs/frontend//`: feature/, data-access/, and util/ (ui/ in shared). - -## Commit Conventions - -Format: `(): ` — scope is optional but encouraged. - -Allowed types: `feat` `fix` `chore` `docs` `style` `refactor` `perf` `test` `build` `ci` `revert` - -Rules: - -- Scope: kebab-case -- Subject: lowercase, no trailing period, max header 100 chars -- Body: blank line before body if present - -Use `pnpm run commit` for the interactive Commitizen prompt. - -## Coding Conventions - -- Angular file naming: kebab-case, suffix-typed (`.component.ts`, `.service.ts`, `.spec.ts`) -- Styles: SCSS only. Themes in `libs/frontend/shared/ui/src/lib/styles/themes/` -- No barrel `index.ts` files at app level — use direct path imports -- Go packages: lowercase single-word names, follow standard Go layout -- Never put a Jira ticket ID (`JDWLABS-*`) or PR/issue number in a code comment — traceability lives in the commit message and PR description, not in source that outlives the ticket - -## Versioning / Release - -Versioning is managed by `nx release` (config in `nx.json` under `release`). Independent -per-project versions, tags `{projectName}-{version}`, conventional-commit driven bumps -(feat=minor, fix=patch, breaking=major; chore/docs/etc never bump). Version manifests: -Angular apps `public/VERSION`, backend/database apps `VERSION` at project root -(custom actions in `tools/release/`), shared libs `package.json`. Per-project -`CHANGELOG.md` and GitHub Releases are generated by the release job in CI. -**Do not manually edit version files. Never run `nx release` locally without `--dry-run`.** - -## CI/CD - -GitHub Actions on `ubuntu-latest` (GitHub-hosted): - -1. `nx format:check` — formatting gate -2. PR only: `commitlint` — validates all commit messages in the PR -3. `nx affected -t lint test` — affected projects -4. `nx affected -t build` — affected builds -5. **Main push only:** `nx release` job (version, changelog, tag, GitHub Release), then per-project deliver matrix (Docker image → deployments Helm bump → Docker Hub description), then E2E dispatch. - -## Autonomy Boundaries - -Safe to run autonomously: any `pnpm exec nx ...` build/lint/test/format target, `docker compose -f scripts/docker/compose.yaml up -d`. +- **go.work:** a Go workspace at the repo root covers `apps/go/servicediscovery` and `libs/go/shared/util` — always run `go` commands from the repo root -Require confirmation first: +## Navigation -- `git push` — always confirm destination branch -- `docker buildx build --push` — pushes to DockerHub -- Any `git reset`, `git rebase`, or `git push --force` -- Changes to `.github/workflows/ci.yml` +- Angular entry points: `apps/angular//src/main.ts` +- Go entry point: `apps/go/servicediscovery/main.go` +- Spring Boot entry point: `apps/springboot/usersrole/src/main/kotlin/` +- Shared Angular code: `libs/angular/` +- Shared Go code: `libs/go/` +- NX project graph: `npx nx graph` -## Do Not +## Constraints -- `git push --force` to `main` -- `--no-verify` on commits — pre-commit (lint-staged) and commit-msg (commitlint) hooks run for a reason -- `npm install` or `yarn` — this project uses **pnpm** only -- Skip `pnpm exec nx reset` after editing `project.json` targets -- Add direct dependencies between Angular apps — use shared libs in `libs/frontend/` (e.g. never import `scope:authui` libs from `scope:container` code; use `scope:shared`) -- Add new projects without `type:`, `scope:`, and `framework:` tags in `project.json` -- Commit anything to `docs/superpowers/` — it is gitignored intentionally (local planning only) -- Modify `.github/workflows/ci.yml` buildx/`build-image` steps without understanding the docker-container BuildKit + multi-arch qemu setup -- Run `nx release` without `--dry-run` locally — real releases are CI-only -- Hardcode secrets — all secrets come from environment variables injected at deploy time +- Do not add direct dependencies between Angular apps — use shared libs in `libs/angular/` +- All secrets come from environment variables injected at deploy time — no hardcoded secrets +- Do not push to remote without developer review diff --git a/CLAUDE.md b/CLAUDE.md index 74d9ee910..6b08b18e6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,7 +1,156 @@ -# CLAUDE.md +# CLAUDE.md — jdwlabs/apps Monorepo -This file provides guidance to Claude Code (claude.ai/code) when working in this repository. +This file is read by Claude Code at the start of every session. Keep it current. -The canonical agent instructions live in [AGENTS.md](AGENTS.md) — that file is the single source of truth. Do not add repo guidance here; edit AGENTS.md instead. +## Overview -@AGENTS.md +Nx 22 monorepo with Angular 21 micro-frontend apps, Go services, a Spring Boot service, PostgreSQL migration runners, and shared Angular libraries. All CI runs on self-hosted ARC runners (`ubuntu-jdwlabs`). Package manager is **pnpm 10**. + +## Worktree Location (Windows — CRITICAL) + +This repo lives on **F: drive** (`F:\Dev\projects\personal\jdwlabs\apps`). + +**Worktrees MUST be created on the same drive (F:).** + +pnpm uses hard links for its content-addressable store. Hard links cannot cross NTFS volume boundaries. If a worktree is on C: and the repo is on F:, `pnpm install` will silently succeed but produce an empty `node_modules` (only `.pnpm` dir) — no binaries, no hoisted packages. Git hooks that call `npx --no-install ` will then fail. + +```bash +# CORRECT — same drive as repo +gwta feat/my-feature # creates F:\Dev\worktrees\apps\feat\my-feature + +# or manually: +git worktree add F:/Dev/worktrees/apps/feat/my-feature -b feat/my-feature + +# keep worktrees on F: drive: +export WT_BASE=F:/Dev/worktrees # in ~/.bashrc +``` + +If a cross-drive worktree left `node_modules` with only `.pnpm` and no `.bin`, replace it with a junction to the main repo's `node_modules`: + +```powershell +Remove-Item -Recurse -Force C:\path\to\worktree\node_modules +New-Item -ItemType Junction -Path C:\path\to\worktree\node_modules -Target F:\Dev\projects\personal\jdwlabs\apps\node_modules +``` + +## Directory Map + +Role-based layout (as of JDWLABS-20): + +``` +apps/ + frontend/ # Angular micro-frontend apps (authui, container, rolesui, usersui) + backend/ # Go (servicediscovery) + Spring Boot (usersrole) services + database/ # DB migration runners (authdb — PostgreSQL) + e2e/ # Playwright E2E tests +libs/ + frontend/ # Shared Angular libs (per-app: authui/container/rolesui/usersui + shared) + backend/ # Go shared packages +tools/ + agents/ # Nx-adjacent Docker dev agent — DO NOT move or restructure +scripts/ # Non-Nx shell scripts and Docker Compose helpers + docker/ # docker/compose.yaml — local dev stack +docs/ + # architecture, conventions, workflows, onboarding +``` + +## Key Commands + +```bash +# Affected lint + test (use this during development) +pnpm exec nx affected -t lint test + +# Format check (must pass in CI) +pnpm exec nx format:check + +# Auto-fix formatting +pnpm exec nx format:write + +# Run a specific Nx target +pnpm exec nx run : +# e.g. pnpm exec nx run container:build + +# Reset Nx project graph (required after editing project.json) +pnpm exec nx reset + +# Interactive commit (commitizen) +pnpm run commit + +# Start local Docker stack +docker compose -f scripts/docker/compose.yaml up -d +``` + +## Nx Project Tags + +Every `project.json` has three tag families: + +- `type:app` | `type:lib` | `type:e2e` | `type:feature` | `type:ui` | `type:data-access` | `type:util` +- `scope:` — app-level scope; names come from `project.json` files. Run `pnpm exec nx show projects` for the current list. +- `framework:angular` | `framework:go` | `framework:springboot` | `framework:database` | `framework:playwright` + +Module boundary rules in `eslint.config.ts` enforce: + +- Per-app-scope isolation: a `scope:X` lib may only import from `scope:X` or `scope:shared` libs +- Framework isolation: `framework:angular` libs may only import from other `framework:angular` libs +- Type hierarchy: `type:feature` → `type:ui` + `type:util` + `type:data-access` (no circular) + +## Angular Architecture + +Four Angular apps use **webpack module federation**: + +- `container` — shell app, loads remotes at runtime +- `authui`, `rolesui`, `usersui` — remote apps + +Each app has libs under `libs/frontend//`: feature/, data-access/, and util/ (ui/ in shared). + +## Commit Conventions + +Format: `(): ` — scope is optional but encouraged. + +Allowed types: `feat` `fix` `chore` `docs` `style` `refactor` `perf` `test` `build` `ci` `revert` + +Rules: + +- Scope: kebab-case +- Subject: lowercase, no trailing period, max header 100 chars +- Body: blank line before body if present + +``` +feat(authui): add oauth2 login flow +fix(container): resolve mfe chunk loading error +chore(deps): bump @angular/core to 21.2.10 +build(lint): migrate to eslint flat config +``` + +Use `pnpm run commit` for the interactive Commitizen prompt. + +## Coding Conventions + +- Angular file naming: kebab-case, suffix-typed (`.component.ts`, `.service.ts`, `.spec.ts`) +- Styles: SCSS only. Themes in `libs/frontend/shared/ui/src/lib/styles/themes/` +- No barrel `index.ts` files at app level — use direct path imports +- Go packages: lowercase single-word names, follow standard Go layout + +## Versioning / Release + +Versioning is managed by `@jscutlery/semver` via the `version` Nx target on each app. It reads conventional commits, bumps semver, tags the repo, and triggers `postTargets` (format, save-version, build-image, update-app). **Do not manually edit version files.** + +## CI/CD + +GitHub Actions on `ubuntu-jdwlabs` (self-hosted ARC runner): + +1. `nx format:check` — formatting gate +2. PR only: `commitlint` — validates all commit messages in the PR +3. `nx affected -t lint test` — affected projects +4. `nx affected -t build` — affected builds +5. **Main push only:** Docker image build+push (DockerHub), semver bump, Helm Chart update, push to `develop` + +## Do Not + +- `git push --force` to `main` +- `--no-verify` on commits — pre-commit (lint-staged) and commit-msg (commitlint) hooks run for a reason +- Skip `pnpm exec nx reset` after editing `project.json` targets +- Import `scope:authui` libs from `scope:container` code — use `scope:shared` instead +- Add new projects without `type:`, `scope:`, and `framework:` tags in `project.json` +- Commit anything to `docs/superpowers/` — it is gitignored intentionally (local planning only) +- Modify `.github/workflows/ci.yml` `build-image` steps without understanding ARC + Kubernetes BuildKit constraints +- Run `nx affected -t version` locally — semver tagging runs in CI only diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bdbf4f6cc..3ac6d66ed 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,19 +6,19 @@ This repository follows [Conventional Commits](https://www.conventionalcommits.o ### Types -| Type | When to use | -| ---------- | ----------------------------------------------------------------- | -| `feat` | New feature or user-visible capability | -| `fix` | Bug fix | -| `build` | Build system or external dependency change (NX, pnpm, Go modules) | -| `chore` | Maintenance: config, tooling (no production code change) | -| `ci` | CI/CD pipeline changes | -| `docs` | Documentation only (no code changes) | -| `perf` | Performance improvement | -| `refactor` | Code restructure with no behavior change | -| `revert` | Reverting a previous commit | -| `style` | Formatting or whitespace only (no logic change) | -| `test` | Adding or updating tests | +| Type | When to use | +|------|-------------| +| `feat` | New feature or user-visible capability | +| `fix` | Bug fix | +| `build` | Build system or external dependency change (NX, pnpm, Go modules) | +| `chore` | Maintenance: config, tooling (no production code change) | +| `ci` | CI/CD pipeline changes | +| `docs` | Documentation only (no code changes) | +| `perf` | Performance improvement | +| `refactor` | Code restructure with no behavior change | +| `revert` | Reverting a previous commit | +| `style` | Formatting or whitespace only (no logic change) | +| `test` | Adding or updating tests | ### Format @@ -46,13 +46,13 @@ test(usersrole): add integration test for role assignment Footers appear after an optional body, separated by a blank line. Common footers: -| Footer | When to use | -| ------------------------------ | ----------------------------------------------------------------- | -| `Refs: JDWLABS-XX` | Links commit to a Jira issue (does not close it) | -| `Closes: JDWLABS-XX` | Closes the Jira issue on merge | -| `Closes: #N` | Closes a GitHub issue by number | -| `BREAKING CHANGE: ` | Required when a commit introduces a breaking API/interface change | -| `Co-Authored-By: Name ` | Credit a co-author (human or AI) | +| Footer | When to use | +|--------|-------------| +| `Refs: JDWLABS-XX` | Links commit to a Jira issue (does not close it) | +| `Closes: JDWLABS-XX` | Closes the Jira issue on merge | +| `Closes: #N` | Closes a GitHub issue by number | +| `BREAKING CHANGE: ` | Required when a commit introduces a breaking API/interface change | +| `Co-Authored-By: Name ` | Credit a co-author (human or AI) | **AI contributor footer** — include when commits were written with AI assistance: diff --git a/GEMINI.md b/GEMINI.md index ee8a397bd..ada0310a3 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -1,7 +1,35 @@ # GEMINI.md This file provides guidance to Gemini CLI when working in this repository. +For the canonical reference, see [CLAUDE.md](CLAUDE.md) — this file mirrors that content. -The canonical agent instructions live in [AGENTS.md](AGENTS.md) — that file is the single source of truth. Do not add repo guidance here; edit AGENTS.md instead. +## Repository Overview -@AGENTS.md +NX monorepo for jdwlabs application services. Contains Angular micro-frontends, Go backend services, a Spring Boot/Kotlin service, and database migration tooling. + +### Structure + +- `apps/angular/` — Angular micro-frontend apps (authui, container, rolesui, usersui, platform-e2e) +- `apps/go/` — Go services (servicediscovery) +- `apps/springboot/` — Spring Boot/Kotlin service (usersrole) +- `apps/database/` — Database migration apps (authdb) +- `libs/angular/` — Shared Angular libraries +- `libs/go/` — Shared Go libraries + +## Development Commands + +```bash +npx nx build # Build one app +npx nx test # Test one app +npx nx lint # Lint one app +npx nx affected -t build,test # CI-equivalent: affected apps only +go build ./... # Go workspace build (from repo root) +go test ./... # Go workspace test (from repo root) +``` + +## Agent Contract + +- Use `npx nx` for all Angular build/test/lint — never `ng` directly +- Use `go` commands from repo root for Go services (`go.work` covers `apps/go/` and `libs/go/`) +- Do not modify lockfiles directly +- Do not push to remote — stage and commit only diff --git a/README.md b/README.md index 3dd4d7990..f0cc17ac9 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,15 @@ ![Angular](https://img.shields.io/badge/Angular-21-blue) [![License](https://img.shields.io/badge/License-PolyForm%20NonCommercial%201.0-blue)](https://polyformproject.org/licenses/noncommercial/1.0.0/) -This is a multi-language, multi-project repository that houses all code, configuration, and tooling. This repository is +This is a multi-language, multi-project repository that houses all code, configuration, and tooling. This repository is organized into three main directories: - **apps**: Contains full application code for both frontends and backends. - **libs**: Contains reusable libraries, grouped by type: - - **feature**: Components and views specific to a feature or domain. - - **data-access**: Logic for communicating with backends, APIs, or databases. - - **util**: Common utilities, helper functions, and shared models. - - **ui**: Reusable UI components, theming, and styling. + - **feature**: Components and views specific to a feature or domain. + - **data-access**: Logic for communicating with backends, APIs, or databases. + - **util**: Common utilities, helper functions, and shared models. + - **ui**: Reusable UI components, theming, and styling. - **tools**: Contains scripts and configuration for versioning, formatting, Docker orchestration, and CI/CD. ## Directory Structure @@ -69,13 +69,13 @@ organized into three main directories: - **Role-Based Grouping**: Top-level organization by role (`frontend`, `backend`, `e2e`, `database`). - **App-Specific Isolation**: Libraries scoped to specific applications. - **Shared Code Hierarchy**: - - **App-Scoped**: Only used by one application (e.g., `frontend/usersui/*`). - - **Frontend-Shared**: Shared across Angular apps (e.g., `frontend/shared/*`). + - **App-Scoped**: Only used by one application (e.g., `frontend/usersui/*`). + - **Frontend-Shared**: Shared across Angular apps (e.g., `frontend/shared/*`). - **Library Types**: - - `feature/`: Domain-specific components and logic. - - `data-access/`: API/backend communication. - - `util/`: Helper functions and utilities. - - `ui/`: Reusable UI components. + - `feature/`: Domain-specific components and logic. + - `data-access/`: API/backend communication. + - `util/`: Helper functions and utilities. + - `ui/`: Reusable UI components. ## 🚀 Running Tasks diff --git a/apps/backend/ai-sre-relay/.gitignore b/apps/backend/ai-sre-relay/.gitignore deleted file mode 100644 index b883f1fdc..000000000 --- a/apps/backend/ai-sre-relay/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.exe diff --git a/apps/backend/ai-sre-relay/CHANGELOG.md b/apps/backend/ai-sre-relay/CHANGELOG.md deleted file mode 100644 index b6e633c05..000000000 --- a/apps/backend/ai-sre-relay/CHANGELOG.md +++ /dev/null @@ -1,120 +0,0 @@ -# 1.0.0 (2026-07-10) - -### 🚀 Features - -- **ai-sre-relay:** render Discord alerts as rich embeds ([9d782844](https://github.com/jdwlabs/apps/commit/9d782844)) -- **ai-sre-relay:** bound concurrency, drain on shutdown, auth+limits ([d7d75a93](https://github.com/jdwlabs/apps/commit/d7d75a93)) -- **ai-sre-relay:** add container images ([3fd53ad8](https://github.com/jdwlabs/apps/commit/3fd53ad8)) -- **ai-sre-relay:** add webhook ingress and wire main ([dcbb56b1](https://github.com/jdwlabs/apps/commit/dcbb56b1)) -- **ai-sre-relay:** add pipeline orchestrator with independence tests ([9a293fc2](https://github.com/jdwlabs/apps/commit/9a293fc2)) -- **ai-sre-relay:** add github pr opener ([f423ef55](https://github.com/jdwlabs/apps/commit/f423ef55)) -- **ai-sre-relay:** add jira upsert with fingerprint dedup ([38fd20ae](https://github.com/jdwlabs/apps/commit/38fd20ae)) -- **ai-sre-relay:** add discord notifier ([41816b6b](https://github.com/jdwlabs/apps/commit/41816b6b)) -- **ai-sre-relay:** add litellm patch generator with confidence gate ([3448f2c2](https://github.com/jdwlabs/apps/commit/3448f2c2)) -- **ai-sre-relay:** add holmes investigation client ([a5660cb6](https://github.com/jdwlabs/apps/commit/a5660cb6)) -- **ai-sre-relay:** add domain types ([d73db1e0](https://github.com/jdwlabs/apps/commit/d73db1e0)) -- **ai-sre-relay:** scaffold nx go project with healthz ([2544cc27](https://github.com/jdwlabs/apps/commit/2544cc27)) - -### 🩹 Fixes - -- **ai-sre-relay:** reopen done jira issues instead of duplicating ([c5072ddf](https://github.com/jdwlabs/apps/commit/c5072ddf)) -- **ai-sre-relay:** truncate patch rationale to stay under discord's field limit ([2aadfdd7](https://github.com/jdwlabs/apps/commit/2aadfdd7)) -- **ai-sre-relay:** configurable jira issue type, default Task ([2044b870](https://github.com/jdwlabs/apps/commit/2044b870)) -- **ai-sre-relay:** failure notice survives dead per-alert context ([75498899](https://github.com/jdwlabs/apps/commit/75498899)) -- **ai-sre-relay:** migrate jira dedup search to /search/jql ([f49dda49](https://github.com/jdwlabs/apps/commit/f49dda49)) -- **ai-sre-relay:** drop client timeout on LLM-bound calls ([8db9f384](https://github.com/jdwlabs/apps/commit/8db9f384)) -- **ai-sre-relay:** call Holmes /api/chat; investigate endpoint gone ([ff0194da](https://github.com/jdwlabs/apps/commit/ff0194da)) -- **ai-sre-relay:** check jira search status, recover webhook panics, harden github/patch ([212ec5b0](https://github.com/jdwlabs/apps/commit/212ec5b0)) -- **ai-sre-relay:** fail on jira decode/marshal errors and test error+auth paths ([64ff7a03](https://github.com/jdwlabs/apps/commit/64ff7a03)) -- **ai-sre-relay:** use generic example in IssueKey comment ([a39e083f](https://github.com/jdwlabs/apps/commit/a39e083f)) -- **ai-sre-relay:** remove build artifact and comment refs, assert healthz body ([b39625e4](https://github.com/jdwlabs/apps/commit/b39625e4)) - -### ❤️ Thank You - -- Claude Fable 5 -- Claude Opus 4.8 -- Claude Sonnet 4.6 -- Claude Sonnet 5 -- Jake Willmsen @jdwillmsen - -## 0.2.1 (2026-07-07) - -### 🩹 Fixes - -- **ai-sre-relay:** reopen done jira issues instead of duplicating ([18173894](https://github.com/jdwlabs/apps/commit/18173894)) - -### ❤️ Thank You - -- Jake Willmsen @jdwillmsen - -## 0.2.0 (2026-07-07) - -### 🚀 Features - -- **ai-sre-relay:** render Discord alerts as rich embeds ([8ac68d07](https://github.com/jdwlabs/apps/commit/8ac68d07)) - -### 🩹 Fixes - -- **ai-sre-relay:** truncate patch rationale to stay under discord's field limit ([4f58859d](https://github.com/jdwlabs/apps/commit/4f58859d)) - -### ❤️ Thank You - -- Claude Sonnet 5 -- Jake Willmsen @jdwillmsen - -# Changelog - -This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). - -## [0.1.5](https://github.com/jdwlabs/apps/compare/ai-sre-relay-0.1.4...ai-sre-relay-0.1.5) (2026-07-04) - -### Bug Fixes - -- **ai-sre-relay:** configurable jira issue type, default Task ([54d0c74](https://github.com/jdwlabs/apps/commit/54d0c7446b68a87608f7ea73a0fedd053bd1a6c4)) - -## [0.1.4](https://github.com/jdwlabs/apps/compare/ai-sre-relay-0.1.3...ai-sre-relay-0.1.4) (2026-07-04) - -### Bug Fixes - -- **ai-sre-relay:** failure notice survives dead per-alert context ([7066f85](https://github.com/jdwlabs/apps/commit/7066f859ace3a8b1f136d5088f6ea979b706888c)) - -## [0.1.3](https://github.com/jdwlabs/apps/compare/ai-sre-relay-0.1.2...ai-sre-relay-0.1.3) (2026-07-04) - -### Bug Fixes - -- **ai-sre-relay:** migrate jira dedup search to /search/jql ([4e94c3e](https://github.com/jdwlabs/apps/commit/4e94c3ed2d991584de7afa31c2b2e695c009dc4b)) - -## [0.1.2](https://github.com/jdwlabs/apps/compare/ai-sre-relay-0.1.1...ai-sre-relay-0.1.2) (2026-07-04) - -### Bug Fixes - -- **ai-sre-relay:** drop client timeout on LLM-bound calls ([bca27ee](https://github.com/jdwlabs/apps/commit/bca27eebf888e36138c94ae1660be213f997059b)) - -## [0.1.1](https://github.com/jdwlabs/apps/compare/ai-sre-relay-0.1.0...ai-sre-relay-0.1.1) (2026-07-04) - -### Bug Fixes - -- **ai-sre-relay:** call Holmes /api/chat; investigate endpoint gone ([6de9d11](https://github.com/jdwlabs/apps/commit/6de9d11d0493fa3b61185898ee509bcc46f8ad44)) - -## 0.1.0 (2026-07-03) - -### Features - -- **ai-sre-relay:** add container images ([68c88f4](https://github.com/jdwlabs/apps/commit/68c88f4bc5dca656e81e7d0c6500c4db8dbaa82f)) -- **ai-sre-relay:** add discord notifier ([91cd7a5](https://github.com/jdwlabs/apps/commit/91cd7a5a2e3be382171f31ccfeef5654249f60db)) -- **ai-sre-relay:** add domain types ([4e2a107](https://github.com/jdwlabs/apps/commit/4e2a1073cb81fb13adb92068eba6288100876b5e)) -- **ai-sre-relay:** add github pr opener ([4e41bde](https://github.com/jdwlabs/apps/commit/4e41bde5dc5664c4f89d14bf3230a3f0f1a78631)) -- **ai-sre-relay:** add holmes investigation client ([ee76c71](https://github.com/jdwlabs/apps/commit/ee76c71bfce0cdccec573aa4be2c676fb3b77d93)) -- **ai-sre-relay:** add jira upsert with fingerprint dedup ([0ffb3a6](https://github.com/jdwlabs/apps/commit/0ffb3a6f9921d3beb94e590e29883046ac5822ca)) -- **ai-sre-relay:** add litellm patch generator with confidence gate ([2dd6626](https://github.com/jdwlabs/apps/commit/2dd66266bd31bbc0c68c1b554f5e3e654fe6f461)) -- **ai-sre-relay:** add pipeline orchestrator with independence tests ([d4729b0](https://github.com/jdwlabs/apps/commit/d4729b0778748e2f0aaafa4b9c9c5bd3be7f0211)) -- **ai-sre-relay:** add webhook ingress and wire main ([9b17023](https://github.com/jdwlabs/apps/commit/9b17023d5c495ec9c1c64b53dcd6c7ed151a31a1)) -- **ai-sre-relay:** bound concurrency, drain on shutdown, auth+limits ([b1f915a](https://github.com/jdwlabs/apps/commit/b1f915a85c996dd8ae9f7541bb7cfee61aebf85e)) -- **ai-sre-relay:** scaffold nx go project with healthz ([ac4b27d](https://github.com/jdwlabs/apps/commit/ac4b27d3a07d85b6728c965165c1dd6570818aa4)) - -### Bug Fixes - -- **ai-sre-relay:** check jira search status, recover webhook panics, harden github/patch ([4e3f310](https://github.com/jdwlabs/apps/commit/4e3f3105a640c7c5138242e7e2dfd3c197bc8e68)) -- **ai-sre-relay:** fail on jira decode/marshal errors and test error+auth paths ([9f5db1f](https://github.com/jdwlabs/apps/commit/9f5db1f97073fc982e00a9677471753b0be2db1b)) -- **ai-sre-relay:** remove build artifact and comment refs, assert healthz body ([892af28](https://github.com/jdwlabs/apps/commit/892af281043368c767b930e3876bccd94d3a5449)) -- **ai-sre-relay:** use generic example in IssueKey comment ([b3e3e56](https://github.com/jdwlabs/apps/commit/b3e3e56151c7b800480405c63d6b175e320e13c2)) diff --git a/apps/backend/ai-sre-relay/Dockerfile b/apps/backend/ai-sre-relay/Dockerfile deleted file mode 100644 index 842ffd214..000000000 --- a/apps/backend/ai-sre-relay/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -# Distroless final image; consumes the Nx build output at ./dist/... -# The CI build-image target runs after `nx build`, so dist/ is populated. -FROM gcr.io/distroless/base-debian12:nonroot AS runner - -WORKDIR /app -COPY ./dist/apps/backend/ai-sre-relay/ai-sre-relay . - -EXPOSE 8080 -ENTRYPOINT ["/app/ai-sre-relay"] diff --git a/apps/backend/ai-sre-relay/Dockerfile.local b/apps/backend/ai-sre-relay/Dockerfile.local deleted file mode 100644 index 55d09f313..000000000 --- a/apps/backend/ai-sre-relay/Dockerfile.local +++ /dev/null @@ -1,13 +0,0 @@ -# Self-contained build for local iteration (no prior `nx build` needed). -FROM golang:1.26-bookworm AS build -WORKDIR /src -COPY apps/backend/ai-sre-relay/go.mod ./ -RUN go mod download || true -COPY apps/backend/ai-sre-relay/ ./ -RUN CGO_ENABLED=0 go build -o /out/ai-sre-relay . - -FROM gcr.io/distroless/base-debian12:nonroot AS runner -WORKDIR /app -COPY --from=build /out/ai-sre-relay . -EXPOSE 8080 -ENTRYPOINT ["/app/ai-sre-relay"] diff --git a/apps/backend/ai-sre-relay/VERSION b/apps/backend/ai-sre-relay/VERSION deleted file mode 100644 index 3eefcb9dd..000000000 --- a/apps/backend/ai-sre-relay/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.0.0 diff --git a/apps/backend/ai-sre-relay/discord.go b/apps/backend/ai-sre-relay/discord.go deleted file mode 100644 index 03b35995b..000000000 --- a/apps/backend/ai-sre-relay/discord.go +++ /dev/null @@ -1,121 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "time" -) - -type DiscordNotifier struct { - webhookURL string - jiraBaseURL string - hc *http.Client -} - -func NewDiscordNotifier(webhookURL, jiraBaseURL string, hc *http.Client) *DiscordNotifier { - if hc == nil { - hc = http.DefaultClient - } - return &DiscordNotifier{webhookURL: webhookURL, jiraBaseURL: jiraBaseURL, hc: hc} -} - -type discordEmbed struct { - Title string `json:"title"` - Description string `json:"description"` - Color int `json:"color"` - Fields []discordEmbedField `json:"fields,omitempty"` - Timestamp string `json:"timestamp,omitempty"` -} - -type discordEmbedField struct { - Name string `json:"name"` - Value string `json:"value"` - Inline bool `json:"inline"` -} - -const ( - colorRed = 0xE74C3C - colorOrange = 0xF39C12 - colorGray = 0x95A5A6 - colorGreen = 0x2ECC71 -) - -// embedColor picks red/orange/gray by severity; a resolved alert is always -// green regardless of severity, since it's good news rather than still-bad. -func embedColor(a Alert) int { - if a.Status == "resolved" { - return colorGreen - } - switch a.Severity() { - case "critical": - return colorRed - case "warning": - return colorOrange - default: - return colorGray - } -} - -func (d *DiscordNotifier) buildEmbed(a Alert, an Analysis, issue IssueKey, pr *PRLink, patch *Patch) discordEmbed { - e := discordEmbed{ - Title: a.Name(), - Description: truncate(an.RootCause, 2000), - Color: embedColor(a), - } - if ns := a.Namespace(); ns != "" { - e.Fields = append(e.Fields, discordEmbedField{Name: "Namespace", Value: ns, Inline: true}) - } - if sev := a.Severity(); sev != "" { - e.Fields = append(e.Fields, discordEmbedField{Name: "Severity", Value: sev, Inline: true}) - } - if issue != "" { - e.Fields = append(e.Fields, discordEmbedField{ - Name: "Jira", - Value: fmt.Sprintf("[%s](%s/browse/%s)", issue, d.jiraBaseURL, issue), - }) - } - if pr != nil { - e.Fields = append(e.Fields, discordEmbedField{Name: "PR", Value: string(*pr)}) - } - if patch != nil { - e.Fields = append(e.Fields, discordEmbedField{ - Name: "Patch", - Value: fmt.Sprintf("%.0f%% confidence — %s", patch.Confidence*100, truncate(patch.Rationale, 900)), - }) - } - if _, err := time.Parse(time.RFC3339, a.StartsAt); err == nil { - e.Timestamp = a.StartsAt - } - return e -} - -func (d *DiscordNotifier) Notify(ctx context.Context, a Alert, an Analysis, issue IssueKey, pr *PRLink, patch *Patch) error { - embed := d.buildEmbed(a, an, issue, pr, patch) - body, _ := json.Marshal(map[string]any{"embeds": []discordEmbed{embed}}) - req, err := http.NewRequestWithContext(ctx, http.MethodPost, d.webhookURL, bytes.NewReader(body)) - if err != nil { - return err - } - req.Header.Set("Content-Type", "application/json") - resp, err := d.hc.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - if resp.StatusCode >= 300 { - return fmt.Errorf("discord: status %d", resp.StatusCode) - } - return nil -} - -// truncate keeps the embed description within a readable budget well under -// Discord's 4096-char description ceiling. -func truncate(s string, n int) string { - if len(s) <= n { - return s - } - return s[:n] + "…" -} diff --git a/apps/backend/ai-sre-relay/discord_test.go b/apps/backend/ai-sre-relay/discord_test.go deleted file mode 100644 index 898dbc06b..000000000 --- a/apps/backend/ai-sre-relay/discord_test.go +++ /dev/null @@ -1,148 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "io" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func newRecordingServer(t *testing.T, body *struct { - Embeds []discordEmbed `json:"embeds"` -}) *httptest.Server { - t.Helper() - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - raw, _ := io.ReadAll(r.Body) - _ = json.Unmarshal(raw, body) - w.WriteHeader(http.StatusNoContent) - })) -} - -func TestDiscordNotifyBuildsEmbedWithLinks(t *testing.T) { - var body struct { - Embeds []discordEmbed `json:"embeds"` - } - srv := newRecordingServer(t, &body) - defer srv.Close() - - pr := PRLink("https://github.com/jdwlabs/platform/pull/9") - patch := &Patch{Confidence: 0.82, Rationale: "bump memory limit"} - alert := Alert{ - Labels: map[string]string{"alertname": "KubePodCrashLooping", "namespace": "database", "severity": "critical"}, - } - err := NewDiscordNotifier(srv.URL, "https://jdwlabs.atlassian.net", srv.Client()).Notify( - context.Background(), alert, Analysis{RootCause: "OOM"}, IssueKey("JDWLABS-123"), &pr, patch) - if err != nil { - t.Fatal(err) - } - if len(body.Embeds) != 1 { - t.Fatalf("expected 1 embed, got %d", len(body.Embeds)) - } - e := body.Embeds[0] - if e.Title != "KubePodCrashLooping" { - t.Fatalf("title = %q", e.Title) - } - if e.Color != colorRed { - t.Fatalf("color = %#x, want red for critical severity", e.Color) - } - var joined string - for _, f := range e.Fields { - joined += f.Name + ":" + f.Value + "\n" - } - if !strings.Contains(joined, "database") { - t.Fatalf("fields missing namespace: %q", joined) - } - if !strings.Contains(joined, "jdwlabs.atlassian.net/browse/JDWLABS-123") { - t.Fatalf("fields missing jira link: %q", joined) - } - if !strings.Contains(joined, "pull/9") { - t.Fatalf("fields missing PR link: %q", joined) - } - if !strings.Contains(joined, "82% confidence") { - t.Fatalf("fields missing patch confidence: %q", joined) - } -} - -func TestDiscordNotifyResolvedAlertIsGreenRegardlessOfSeverity(t *testing.T) { - var body struct { - Embeds []discordEmbed `json:"embeds"` - } - srv := newRecordingServer(t, &body) - defer srv.Close() - - alert := Alert{Status: "resolved", Labels: map[string]string{"alertname": "KubePodCrashLooping", "severity": "critical"}} - err := NewDiscordNotifier(srv.URL, "https://jdwlabs.atlassian.net", srv.Client()).Notify( - context.Background(), alert, Analysis{RootCause: "fixed"}, "", nil, nil) - if err != nil { - t.Fatal(err) - } - if body.Embeds[0].Color != colorGreen { - t.Fatalf("color = %#x, want green for resolved", body.Embeds[0].Color) - } -} - -func TestDiscordNotifyOmitsFieldsWhenAbsent(t *testing.T) { - var body struct { - Embeds []discordEmbed `json:"embeds"` - } - srv := newRecordingServer(t, &body) - defer srv.Close() - - err := NewDiscordNotifier(srv.URL, "https://jdwlabs.atlassian.net", srv.Client()).Notify( - context.Background(), Alert{Labels: map[string]string{"alertname": "X"}}, - Analysis{RootCause: "⚠️ investigation failed: boom"}, "", nil, nil) - if err != nil { - t.Fatal(err) - } - if len(body.Embeds[0].Fields) != 0 { - t.Fatalf("expected no fields when namespace/severity/issue/pr/patch absent, got %+v", body.Embeds[0].Fields) - } -} - -func TestDiscordNotifyTruncatesPatchRationaleThenStayUnder1024Chars(t *testing.T) { - var body struct { - Embeds []discordEmbed `json:"embeds"` - } - srv := newRecordingServer(t, &body) - defer srv.Close() - - // Create a patch with an extremely long rationale (2000 chars) - longRationale := strings.Repeat("x", 2000) - patch := &Patch{Confidence: 0.95, Rationale: longRationale} - alert := Alert{ - Labels: map[string]string{"alertname": "TestAlert"}, - } - err := NewDiscordNotifier(srv.URL, "https://jdwlabs.atlassian.net", srv.Client()).Notify( - context.Background(), alert, Analysis{RootCause: "test"}, "", nil, patch) - if err != nil { - t.Fatal(err) - } - - // Find the Patch field and verify its value is under 1024 chars - if len(body.Embeds) != 1 { - t.Fatalf("expected 1 embed, got %d", len(body.Embeds)) - } - e := body.Embeds[0] - var patchFieldValue string - for _, f := range e.Fields { - if f.Name == "Patch" { - patchFieldValue = f.Value - break - } - } - if patchFieldValue == "" { - t.Fatal("Patch field not found") - } - if len(patchFieldValue) >= 1024 { - t.Fatalf("patch field value exceeds discord's 1024-char limit: got %d chars", len(patchFieldValue)) - } - if !strings.Contains(patchFieldValue, "95% confidence") { - t.Fatalf("patch field missing confidence: %q", patchFieldValue) - } - if !strings.Contains(patchFieldValue, "…") { - t.Fatalf("expected truncate ellipsis in field value: %q", patchFieldValue) - } -} diff --git a/apps/backend/ai-sre-relay/dispatcher.go b/apps/backend/ai-sre-relay/dispatcher.go deleted file mode 100644 index 53389752b..000000000 --- a/apps/backend/ai-sre-relay/dispatcher.go +++ /dev/null @@ -1,96 +0,0 @@ -package main - -import ( - "context" - "log/slog" - "sync" - "time" -) - -// handler is the pipeline seam; the dispatcher depends only on this interface. -type handler interface { - Handle(ctx context.Context, a Alert) error -} - -// dispatcher runs alert investigations on a bounded worker pool. The replica is -// memory-capped (32Mi) and each investigation makes several slow (tens of -// seconds) LLM/HTTP calls, so an unbounded goroutine-per-alert fan-out under a -// large Alertmanager batch would OOM-kill the process. A fixed pool with a -// bounded queue caps both concurrency and memory. -type dispatcher struct { - handler handler - queue chan Alert - perAlertTO time.Duration - log *slog.Logger - wg sync.WaitGroup -} - -func newDispatcher(h handler, workers, queueSize int, perAlertTO time.Duration, log *slog.Logger) *dispatcher { - d := &dispatcher{ - handler: h, - queue: make(chan Alert, queueSize), - perAlertTO: perAlertTO, - log: log, - } - for range workers { - d.wg.Add(1) - go d.worker() - } - return d -} - -func (d *dispatcher) worker() { - defer d.wg.Done() - for a := range d.queue { - d.process(a) - } -} - -func (d *dispatcher) process(a Alert) { - // A panicking client must not kill the worker — that would shrink the pool - // and eventually stall the queue. - defer func() { - if r := recover(); r != nil { - d.log.Error("pipeline panic", "fingerprint", a.Fingerprint, "panic", r) - } - }() - // Bound the whole pipeline (several sequential calls) so one hung upstream - // cannot occupy a worker slot indefinitely. The clients are ctx-aware, so - // this also cancels in-flight requests on shutdown. - ctx, cancel := context.WithTimeout(context.Background(), d.perAlertTO) - defer cancel() - start := time.Now() - _ = d.handler.Handle(ctx, a) - d.log.Info("investigation complete", - "fingerprint", a.Fingerprint, "alert", a.Name(), - "duration_ms", time.Since(start).Milliseconds()) -} - -// enqueue submits an alert without blocking the HTTP response. It returns false -// (and logs) when the queue is saturated; Alertmanager re-sends on -// repeat_interval and Jira dedup absorbs the repeat, so a drop is recoverable, -// not silent. -func (d *dispatcher) enqueue(a Alert) bool { - select { - case d.queue <- a: - return true - default: - d.log.Error("investigation queue full; dropping alert (alertmanager will retry)", - "fingerprint", a.Fingerprint, "alert", a.Name()) - return false - } -} - -// shutdown stops accepting work and waits for in-flight and queued -// investigations to finish, bounded by ctx. Call only after the HTTP server has -// stopped, so no concurrent enqueue races the channel close. -func (d *dispatcher) shutdown(ctx context.Context) { - close(d.queue) - done := make(chan struct{}) - go func() { d.wg.Wait(); close(done) }() - select { - case <-done: - case <-ctx.Done(): - d.log.Warn("shutdown deadline reached; abandoning in-flight investigations") - } -} diff --git a/apps/backend/ai-sre-relay/dispatcher_test.go b/apps/backend/ai-sre-relay/dispatcher_test.go deleted file mode 100644 index 777470560..000000000 --- a/apps/backend/ai-sre-relay/dispatcher_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package main - -import ( - "context" - "sync" - "testing" - "time" -) - -type handlerFunc func(context.Context, Alert) error - -func (f handlerFunc) Handle(ctx context.Context, a Alert) error { return f(ctx, a) } - -func TestDispatcherProcessesAlert(t *testing.T) { - got := make(chan Alert, 1) - h := handlerFunc(func(_ context.Context, a Alert) error { got <- a; return nil }) - d := newDispatcher(h, 1, 4, time.Second, silentLogger()) - - if !d.enqueue(Alert{Fingerprint: "f1"}) { - t.Fatal("enqueue returned false on empty queue") - } - select { - case a := <-got: - if a.Fingerprint != "f1" { - t.Fatalf("processed %s, want f1", a.Fingerprint) - } - case <-time.After(time.Second): - t.Fatal("alert not processed") - } - d.shutdown(context.Background()) -} - -func TestDispatcherRecoversFromPanic(t *testing.T) { - processed := make(chan string, 1) - h := handlerFunc(func(_ context.Context, a Alert) error { - if a.Fingerprint == "boom" { - panic("induced") - } - processed <- a.Fingerprint - return nil - }) - d := newDispatcher(h, 1, 4, time.Second, silentLogger()) - d.enqueue(Alert{Fingerprint: "boom"}) - d.enqueue(Alert{Fingerprint: "ok"}) - - // The single worker must survive the panic and still process the next alert. - select { - case fp := <-processed: - if fp != "ok" { - t.Fatalf("processed %s, want ok", fp) - } - case <-time.After(time.Second): - t.Fatal("worker did not survive panic") - } - d.shutdown(context.Background()) -} - -func TestDispatcherQueueFullDrops(t *testing.T) { - release := make(chan struct{}) - h := handlerFunc(func(_ context.Context, _ Alert) error { - <-release // hold the single worker busy - return nil - }) - d := newDispatcher(h, 1, 1, time.Second, silentLogger()) - - d.enqueue(Alert{Fingerprint: "a"}) // taken by the worker (now blocked) - time.Sleep(20 * time.Millisecond) // ensure worker picked up 'a' - if !d.enqueue(Alert{Fingerprint: "b"}) { // fills the size-1 queue - t.Fatal("second enqueue should fit the queue") - } - if d.enqueue(Alert{Fingerprint: "c"}) { // queue full + worker busy -> drop - t.Fatal("third enqueue should be dropped when the queue is full") - } - close(release) - d.shutdown(context.Background()) -} - -func TestDispatcherShutdownDrains(t *testing.T) { - var mu sync.Mutex - done := 0 - h := handlerFunc(func(_ context.Context, _ Alert) error { - time.Sleep(30 * time.Millisecond) - mu.Lock() - done++ - mu.Unlock() - return nil - }) - d := newDispatcher(h, 2, 8, time.Second, silentLogger()) - for range 4 { - d.enqueue(Alert{Fingerprint: "f"}) - } - d.shutdown(context.Background()) // unbounded ctx: must wait for all 4 - - mu.Lock() - defer mu.Unlock() - if done != 4 { - t.Fatalf("drained %d, want 4", done) - } -} diff --git a/apps/backend/ai-sre-relay/github.go b/apps/backend/ai-sre-relay/github.go deleted file mode 100644 index 56dbdf02c..000000000 --- a/apps/backend/ai-sre-relay/github.go +++ /dev/null @@ -1,135 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/base64" - "encoding/json" - "fmt" - "net/http" -) - -type GitHubClient struct { - apiBase string // https://api.github.com (override in tests) - token string - hc *http.Client -} - -func NewGitHubClient(apiBase, token string, hc *http.Client) *GitHubClient { - if hc == nil { - hc = http.DefaultClient - } - return &GitHubClient{apiBase: apiBase, token: token, hc: hc} -} - -func (g *GitHubClient) req(ctx context.Context, method, path string, body any) (*http.Response, error) { - var buf *bytes.Reader - if body != nil { - b, err := json.Marshal(body) - if err != nil { - return nil, err - } - buf = bytes.NewReader(b) - } else { - buf = bytes.NewReader(nil) - } - req, err := http.NewRequestWithContext(ctx, method, g.apiBase+path, buf) - if err != nil { - return nil, err - } - req.Header.Set("Authorization", "Bearer "+g.token) - req.Header.Set("Accept", "application/vnd.github+json") - return g.hc.Do(req) -} - -// OpenPR creates a branch off main, writes the single patched file, and opens a -// PR for human review. The branch name comes from the patch so callers control -// dedup (re-running the same patch lands on the same branch). -func (g *GitHubClient) OpenPR(ctx context.Context, p Patch, issue IssueKey) (PRLink, error) { - repoPath := "/repos/" + p.Repo - - // 1. base ref SHA - refResp, err := g.req(ctx, http.MethodGet, repoPath+"/git/ref/heads/main", nil) - if err != nil { - return "", err - } - var ref struct { - Object struct { - SHA string `json:"sha"` - } `json:"object"` - } - _ = json.NewDecoder(refResp.Body).Decode(&ref) - refResp.Body.Close() - if ref.Object.SHA == "" { - return "", fmt.Errorf("github: empty base sha") - } - - // 2. create branch; 422 means the branch already exists and is fine (idempotent - // re-run of the same patch), other non-2xx statuses are real failures. - brResp, err := g.req(ctx, http.MethodPost, repoPath+"/git/refs", map[string]string{ - "ref": "refs/heads/" + p.Branch, "sha": ref.Object.SHA, - }) - if err != nil { - return "", err - } - if brResp.StatusCode >= 300 && brResp.StatusCode != http.StatusUnprocessableEntity { - brResp.Body.Close() - return "", fmt.Errorf("github create branch: status %d", brResp.StatusCode) - } - brResp.Body.Close() - - // 3. existing file SHA (needed to update; absent => new file) - var existingSHA string - fResp, err := g.req(ctx, http.MethodGet, repoPath+"/contents/"+p.FilePath+"?ref="+p.Branch, nil) - if err != nil { - return "", err - } - if fResp.StatusCode == http.StatusOK { - var f struct { - SHA string `json:"sha"` - } - _ = json.NewDecoder(fResp.Body).Decode(&f) - existingSHA = f.SHA - } - fResp.Body.Close() - - put := map[string]any{ - "message": fmt.Sprintf("fix(ai-sre): %s (%s)", p.Rationale, issue), - "content": base64.StdEncoding.EncodeToString([]byte(p.NewContent)), - "branch": p.Branch, - } - if existingSHA != "" { - put["sha"] = existingSHA - } - pResp, err := g.req(ctx, http.MethodPut, repoPath+"/contents/"+p.FilePath, put) - if err != nil { - return "", err - } - pResp.Body.Close() - if pResp.StatusCode >= 300 { - return "", fmt.Errorf("github put contents: status %d", pResp.StatusCode) - } - - // 5. open PR - prBody := fmt.Sprintf("Automated AI-SRE remediation for %s.\n\n%s\n\n**Human review required — do not auto-merge.**", issue, p.Rationale) - prResp, err := g.req(ctx, http.MethodPost, repoPath+"/pulls", map[string]string{ - "title": fmt.Sprintf("fix(ai-sre): %s [%s]", p.Rationale, issue), - "head": p.Branch, - "base": "main", - "body": prBody, - }) - if err != nil { - return "", err - } - defer prResp.Body.Close() - if prResp.StatusCode >= 300 { - return "", fmt.Errorf("github create pr: status %d", prResp.StatusCode) - } - var pr struct { - HTMLURL string `json:"html_url"` - } - if err := json.NewDecoder(prResp.Body).Decode(&pr); err != nil { - return "", err - } - return PRLink(pr.HTMLURL), nil -} diff --git a/apps/backend/ai-sre-relay/github_test.go b/apps/backend/ai-sre-relay/github_test.go deleted file mode 100644 index 787b80733..000000000 --- a/apps/backend/ai-sre-relay/github_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package main - -import ( - "context" - "encoding/base64" - "encoding/json" - "io" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func TestGitHubOpenPR(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch { - case r.Method == http.MethodGet && strings.HasSuffix(r.URL.Path, "/git/ref/heads/main"): - _ = json.NewEncoder(w).Encode(map[string]any{"object": map[string]string{"sha": "basesha"}}) - case r.Method == http.MethodPost && strings.HasSuffix(r.URL.Path, "/git/refs"): - w.WriteHeader(http.StatusCreated) - case r.Method == http.MethodGet && strings.Contains(r.URL.Path, "/contents/"): - w.WriteHeader(http.StatusNotFound) // new file - case r.Method == http.MethodPut && strings.Contains(r.URL.Path, "/contents/"): - raw, _ := io.ReadAll(r.Body) - var m map[string]any - _ = json.Unmarshal(raw, &m) - if _, err := base64.StdEncoding.DecodeString(m["content"].(string)); err != nil { - t.Errorf("content not base64: %v", err) - } - w.WriteHeader(http.StatusCreated) - case r.Method == http.MethodPost && strings.HasSuffix(r.URL.Path, "/pulls"): - _ = json.NewEncoder(w).Encode(map[string]string{"html_url": "https://github.com/jdwlabs/platform/pull/9"}) - default: - t.Errorf("unexpected %s %s", r.Method, r.URL.Path) - } - })) - defer srv.Close() - - p := Patch{Repo: "jdwlabs/platform", FilePath: "values.yaml", NewContent: "limits:\n memory: 512Mi\n", Branch: "fix/oom", Rationale: "raise", Confidence: 0.9} - link, err := NewGitHubClient(srv.URL, "ghtok", srv.Client()).OpenPR(context.Background(), p, "JDWLABS-500") - if err != nil { - t.Fatal(err) - } - if link != "https://github.com/jdwlabs/platform/pull/9" { - t.Fatalf("link=%q", link) - } -} diff --git a/apps/backend/ai-sre-relay/go.mod b/apps/backend/ai-sre-relay/go.mod deleted file mode 100644 index 9358028fd..000000000 --- a/apps/backend/ai-sre-relay/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module apps/backend/ai-sre-relay - -go 1.26 diff --git a/apps/backend/ai-sre-relay/holmes.go b/apps/backend/ai-sre-relay/holmes.go deleted file mode 100644 index 6f091c8f0..000000000 --- a/apps/backend/ai-sre-relay/holmes.go +++ /dev/null @@ -1,79 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "strings" -) - -type HolmesClient struct { - baseURL string - model string - hc *http.Client -} - -func NewHolmesClient(baseURL, model string, hc *http.Client) *HolmesClient { - if hc == nil { - hc = http.DefaultClient - } - return &HolmesClient{baseURL: baseURL, model: model, hc: hc} -} - -// chatRequest matches Holmes 0.34.0 /api/chat — the only investigation -// endpoint the server exposes (there is no /api/investigate). Only `ask` -// is required; model must name a key in Holmes' modelList. -type chatRequest struct { - Ask string `json:"ask"` - Model string `json:"model,omitempty"` - Stream bool `json:"stream"` -} - -type chatResponse struct { - Analysis string `json:"analysis"` -} - -// buildAsk flattens the alert into a single investigation prompt, since -// /api/chat takes free text rather than a structured subject. -func buildAsk(a Alert) string { - var b strings.Builder - b.WriteString("Investigate this firing Prometheus alert and identify the root cause.\n") - fmt.Fprintf(&b, "Alert: %s\n", a.Name()) - fmt.Fprintf(&b, "Severity: %s\n", a.Severity()) - fmt.Fprintf(&b, "Namespace: %s\n", a.Namespace()) - if pod := a.Labels["pod"]; pod != "" { - fmt.Fprintf(&b, "Pod: %s\n", pod) - } - if kind := a.Labels["kind"]; kind != "" { - fmt.Fprintf(&b, "Kind: %s\n", kind) - } - if desc := a.Annotations["description"]; desc != "" { - fmt.Fprintf(&b, "Description: %s\n", desc) - } - fmt.Fprintf(&b, "Fingerprint: %s\n", a.Fingerprint) - return b.String() -} - -func (c *HolmesClient) Investigate(ctx context.Context, a Alert) (Analysis, error) { - body, _ := json.Marshal(chatRequest{Ask: buildAsk(a), Model: c.model, Stream: false}) - req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.baseURL+"/api/chat", bytes.NewReader(body)) - if err != nil { - return Analysis{}, err - } - req.Header.Set("Content-Type", "application/json") - resp, err := c.hc.Do(req) - if err != nil { - return Analysis{}, err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return Analysis{}, fmt.Errorf("holmes: status %d", resp.StatusCode) - } - var cr chatResponse - if err := json.NewDecoder(resp.Body).Decode(&cr); err != nil { - return Analysis{}, fmt.Errorf("holmes: decode: %w", err) - } - return Analysis{RootCause: cr.Analysis}, nil -} diff --git a/apps/backend/ai-sre-relay/holmes_test.go b/apps/backend/ai-sre-relay/holmes_test.go deleted file mode 100644 index 416db706d..000000000 --- a/apps/backend/ai-sre-relay/holmes_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func TestHolmesInvestigate(t *testing.T) { - var gotReq chatRequest - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/api/chat" || r.Method != http.MethodPost { - t.Errorf("unexpected request %s %s", r.Method, r.URL.Path) - } - if err := json.NewDecoder(r.Body).Decode(&gotReq); err != nil { - t.Errorf("decode request: %v", err) - } - w.Header().Set("Content-Type", "application/json") - _, _ = w.Write([]byte(`{"analysis": "pod OOMKilled; memory limit too low"}`)) - })) - defer srv.Close() - - a := Alert{Fingerprint: "fp1", Labels: map[string]string{"alertname": "KubePodCrashLooping", "namespace": "prod", "pod": "api-0", "severity": "critical"}, Annotations: map[string]string{"description": "restarting"}} - got, err := NewHolmesClient(srv.URL, "claude-sonnet", srv.Client()).Investigate(context.Background(), a) - if err != nil { - t.Fatal(err) - } - if got.RootCause != "pod OOMKilled; memory limit too low" { - t.Fatalf("RootCause = %q", got.RootCause) - } - if gotReq.Model != "claude-sonnet" { - t.Errorf("Model = %q, want claude-sonnet", gotReq.Model) - } - if gotReq.Stream { - t.Error("Stream = true, want false: relay consumes a single JSON response") - } - for _, want := range []string{"KubePodCrashLooping", "prod", "api-0", "critical", "restarting"} { - if !strings.Contains(gotReq.Ask, want) { - t.Errorf("Ask missing %q: %q", want, gotReq.Ask) - } - } -} - -func TestHolmesInvestigateServerError(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusInternalServerError) - })) - defer srv.Close() - if _, err := NewHolmesClient(srv.URL, "claude-sonnet", srv.Client()).Investigate(context.Background(), Alert{}); err == nil { - t.Fatal("want error on 500, got nil") - } -} diff --git a/apps/backend/ai-sre-relay/jira.go b/apps/backend/ai-sre-relay/jira.go deleted file mode 100644 index ac603d079..000000000 --- a/apps/backend/ai-sre-relay/jira.go +++ /dev/null @@ -1,220 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "net/url" -) - -type JiraClient struct { - baseURL string - email string - token string - projectKey string - issueType string - hc *http.Client -} - -func NewJiraClient(baseURL, email, token, projectKey, issueType string, hc *http.Client) *JiraClient { - if hc == nil { - hc = http.DefaultClient - } - return &JiraClient{baseURL: baseURL, email: email, token: token, projectKey: projectKey, issueType: issueType, hc: hc} -} - -func (j *JiraClient) label(a Alert) string { return "amfp-" + a.Fingerprint } - -func (j *JiraClient) do(ctx context.Context, method, path string, body any) (*http.Response, error) { - var r *bytes.Reader - if body != nil { - b, err := json.Marshal(body) - if err != nil { - return nil, err - } - r = bytes.NewReader(b) - } else { - r = bytes.NewReader(nil) - } - req, err := http.NewRequestWithContext(ctx, method, j.baseURL+path, r) - if err != nil { - return nil, err - } - req.SetBasicAuth(j.email, j.token) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Accept", "application/json") - return j.hc.Do(req) -} - -// Upsert creates a new issue for the alert, comments on the existing open -// issue that carries the fingerprint dedup label, or — when the most recent -// issue for that fingerprint is Done — reopens it before commenting. -// -// Alertmanager fingerprints are stable per labelset, so the same underlying -// condition re-firing after a human closed the ticket means "resolved for -// now", not "never contact again". Excluding Done issues from the dedup -// search (as the original implementation did) made the relay create a fresh -// duplicate on every refire once a ticket was closed (JDWLABS-126). -func (j *JiraClient) Upsert(ctx context.Context, a Alert, an Analysis) (IssueKey, error) { - // /rest/api/3/search was removed by Atlassian in 2025; its /search/jql - // replacement returns bare issue IDs unless fields are requested. status - // is requested too so we can tell a Done match from an open one without - // a second round-trip; ORDER BY + maxResults=1 pins it to the most - // recently touched issue for this fingerprint. - jql := fmt.Sprintf(`project = %s AND labels = "%s" ORDER BY created DESC`, j.projectKey, j.label(a)) - resp, err := j.do(ctx, http.MethodGet, "/rest/api/3/search/jql?fields=key,status&maxResults=1&jql="+url.QueryEscape(jql), nil) - if err != nil { - return "", err - } - // A non-2xx search response (auth failure, rate-limit, server error) returns - // a JSON error body that decodes fine with Issues == nil, which would - // incorrectly pass the dedup check and create a duplicate issue. Fail-safe: - // surface the error instead. - if resp.StatusCode >= 300 { - resp.Body.Close() - return "", fmt.Errorf("jira search: status %d", resp.StatusCode) - } - var search struct { - Issues []struct { - Key string `json:"key"` - Fields struct { - Status struct { - StatusCategory struct { - Key string `json:"key"` - } `json:"statusCategory"` - } `json:"status"` - } `json:"fields"` - } `json:"issues"` - } - if err := json.NewDecoder(resp.Body).Decode(&search); err != nil { - resp.Body.Close() - return "", err - } - resp.Body.Close() - - if len(search.Issues) == 0 { - return j.create(ctx, a, an) - } - - issue := search.Issues[0] - key := IssueKey(issue.Key) - text := an.RootCause - if issue.Fields.Status.StatusCategory.Key == "done" { - if err := j.reopen(ctx, key); err != nil { - return "", err - } - text = "🔁 Alert re-fired after this ticket was closed; reopening.\n\n" + text - } - return j.commentOn(ctx, key, text) -} - -func (j *JiraClient) commentOn(ctx context.Context, key IssueKey, text string) (IssueKey, error) { - cResp, err := j.do(ctx, http.MethodPost, fmt.Sprintf("/rest/api/3/issue/%s/comment", key), adf(text)) - if err != nil { - return "", err - } - defer cResp.Body.Close() - if cResp.StatusCode >= 300 { - return "", fmt.Errorf("jira comment: status %d", cResp.StatusCode) - } - return key, nil -} - -func (j *JiraClient) create(ctx context.Context, a Alert, an Analysis) (IssueKey, error) { - create := map[string]any{ - "fields": map[string]any{ - "project": map[string]string{"key": j.projectKey}, - "issuetype": map[string]string{"name": j.issueType}, - "summary": "AI-SRE: " + a.Name(), - "description": adfDoc(an.RootCause), - "labels": []string{j.label(a), "ai-sre"}, - }, - } - cResp, err := j.do(ctx, http.MethodPost, "/rest/api/3/issue", create) - if err != nil { - return "", err - } - defer cResp.Body.Close() - if cResp.StatusCode >= 300 { - return "", fmt.Errorf("jira create: status %d", cResp.StatusCode) - } - var created struct { - Key string `json:"key"` - } - if err := json.NewDecoder(cResp.Body).Decode(&created); err != nil { - return "", err - } - return IssueKey(created.Key), nil -} - -// reopen transitions a Done issue back to an open status so a refiring -// alert updates the original ticket instead of spawning a duplicate. It -// picks the first available transition whose target status sits outside -// the Done category; workflows name this transition differently ("Reopen", -// "Backlog", "To Do", ...), so the target status category is what matters, -// not the transition name. -func (j *JiraClient) reopen(ctx context.Context, key IssueKey) error { - resp, err := j.do(ctx, http.MethodGet, fmt.Sprintf("/rest/api/3/issue/%s/transitions", key), nil) - if err != nil { - return err - } - if resp.StatusCode >= 300 { - resp.Body.Close() - return fmt.Errorf("jira transitions: status %d", resp.StatusCode) - } - var t struct { - Transitions []struct { - ID string `json:"id"` - To struct { - StatusCategory struct { - Key string `json:"key"` - } `json:"statusCategory"` - } `json:"to"` - } `json:"transitions"` - } - if err := json.NewDecoder(resp.Body).Decode(&t); err != nil { - resp.Body.Close() - return err - } - resp.Body.Close() - - var transitionID string - for _, tr := range t.Transitions { - if tr.To.StatusCategory.Key != "done" { - transitionID = tr.ID - break - } - } - if transitionID == "" { - return fmt.Errorf("jira reopen %s: no non-Done transition available", key) - } - - tResp, err := j.do(ctx, http.MethodPost, fmt.Sprintf("/rest/api/3/issue/%s/transitions", key), - map[string]any{"transition": map[string]string{"id": transitionID}}) - if err != nil { - return err - } - defer tResp.Body.Close() - if tResp.StatusCode >= 300 { - return fmt.Errorf("jira transition %s: status %d", key, tResp.StatusCode) - } - return nil -} - -// adf wraps text as an Atlassian Document Format comment body. -func adf(text string) map[string]any { - return map[string]any{"body": adfDoc(text)} -} - -func adfDoc(text string) map[string]any { - return map[string]any{ - "type": "doc", - "version": 1, - "content": []any{map[string]any{ - "type": "paragraph", - "content": []any{map[string]any{"type": "text", "text": text}}, - }}, - } -} diff --git a/apps/backend/ai-sre-relay/jira_test.go b/apps/backend/ai-sre-relay/jira_test.go deleted file mode 100644 index bb5bfe5d3..000000000 --- a/apps/backend/ai-sre-relay/jira_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "io" - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" -) - -func TestJiraUpsertCreatesWhenNoDuplicate(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Authorization") == "" { - t.Errorf("missing Authorization header on %s %s", r.Method, r.URL.Path) - } - switch { - case r.Method == http.MethodGet && r.URL.Path == "/rest/api/3/search/jql": - if r.URL.Query().Get("fields") != "key,status" { - t.Errorf("search must request the key and status fields explicitly, got %q", r.URL.RawQuery) - } - _ = json.NewEncoder(w).Encode(map[string]any{"issues": []any{}}) - case r.Method == http.MethodPost && r.URL.Path == "/rest/api/3/issue": - raw, _ := io.ReadAll(r.Body) - if !strings.Contains(string(raw), "amfp-fp1") { - t.Errorf("create missing dedup label: %s", raw) - } - if !strings.Contains(string(raw), `"name":"Task"`) { - t.Errorf("create must use the configured issue type: %s", raw) - } - w.WriteHeader(http.StatusCreated) - _ = json.NewEncoder(w).Encode(map[string]string{"key": "JDWLABS-500"}) - default: - t.Errorf("unexpected %s %s", r.Method, r.URL.Path) - } - })) - defer srv.Close() - - key, err := NewJiraClient(srv.URL, "e@x", "tok", "JDWLABS", "Task", srv.Client()). - Upsert(context.Background(), Alert{Fingerprint: "fp1", Labels: map[string]string{"alertname": "X"}}, Analysis{RootCause: "y"}) - if err != nil || key != "JDWLABS-500" { - t.Fatalf("key=%q err=%v", key, err) - } -} - -func TestJiraUpsertCommentsWhenDuplicate(t *testing.T) { - commented := false - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Authorization") == "" { - t.Errorf("missing Authorization header on %s %s", r.Method, r.URL.Path) - } - switch { - case strings.HasPrefix(r.URL.Path, "/rest/api/3/search"): - _ = json.NewEncoder(w).Encode(map[string]any{"issues": []map[string]string{{"key": "JDWLABS-77"}}}) - case r.Method == http.MethodPost && strings.HasSuffix(r.URL.Path, "/comment"): - commented = true - w.WriteHeader(http.StatusCreated) - default: - t.Errorf("unexpected %s %s", r.Method, r.URL.Path) - } - })) - defer srv.Close() - - key, err := NewJiraClient(srv.URL, "e@x", "tok", "JDWLABS", "Task", srv.Client()). - Upsert(context.Background(), Alert{Fingerprint: "fp1"}, Analysis{RootCause: "y"}) - if err != nil || key != "JDWLABS-77" || !commented { - t.Fatalf("key=%q err=%v commented=%v", key, err, commented) - } -} - -// TestJiraUpsertReopensDoneDuplicate reproduces JDWLABS-126: Alertmanager -// fingerprints are stable per labelset, so once a human closes the Jira -// ticket for a fingerprint, the same alert re-firing must reopen the -// original ticket rather than spawn a duplicate. -func TestJiraUpsertReopensDoneDuplicate(t *testing.T) { - created, transitioned, commented := false, false, false - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Authorization") == "" { - t.Errorf("missing Authorization header on %s %s", r.Method, r.URL.Path) - } - switch { - case r.Method == http.MethodGet && strings.HasPrefix(r.URL.Path, "/rest/api/3/search"): - jql, _ := url.QueryUnescape(r.URL.Query().Get("jql")) - if strings.Contains(jql, "statusCategory != Done") { - // Real Jira excludes Done issues from this clause: the old - // ticket for this fingerprint is Done, so it never matches. - _ = json.NewEncoder(w).Encode(map[string]any{"issues": []any{}}) - return - } - _ = json.NewEncoder(w).Encode(map[string]any{"issues": []map[string]any{{ - "key": "JDWLABS-107", - "fields": map[string]any{"status": map[string]any{"statusCategory": map[string]any{"key": "done"}}}, - }}}) - case r.Method == http.MethodGet && strings.HasSuffix(r.URL.Path, "/transitions"): - _ = json.NewEncoder(w).Encode(map[string]any{"transitions": []map[string]any{ - {"id": "31", "name": "Done", "to": map[string]any{"statusCategory": map[string]any{"key": "done"}}}, - {"id": "11", "name": "Reopen", "to": map[string]any{"statusCategory": map[string]any{"key": "new"}}}, - }}) - case r.Method == http.MethodPost && strings.HasSuffix(r.URL.Path, "/transitions"): - raw, _ := io.ReadAll(r.Body) - if !strings.Contains(string(raw), `"id":"11"`) { - t.Errorf("expected transition to the non-Done id 11, got %s", raw) - } - transitioned = true - w.WriteHeader(http.StatusNoContent) - case r.Method == http.MethodPost && strings.HasSuffix(r.URL.Path, "/comment"): - commented = true - w.WriteHeader(http.StatusCreated) - case r.Method == http.MethodPost && r.URL.Path == "/rest/api/3/issue": - created = true - w.WriteHeader(http.StatusCreated) - _ = json.NewEncoder(w).Encode(map[string]string{"key": "JDWLABS-500"}) - default: - t.Errorf("unexpected %s %s", r.Method, r.URL.Path) - } - })) - defer srv.Close() - - key, err := NewJiraClient(srv.URL, "e@x", "tok", "JDWLABS", "Task", srv.Client()). - Upsert(context.Background(), Alert{Fingerprint: "9b76534c7edc3c13", Labels: map[string]string{"alertname": "X"}}, Analysis{RootCause: "y"}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if created { - t.Fatal("must reopen the Done issue, not create a duplicate") - } - if key != "JDWLABS-107" { - t.Fatalf("expected the original issue key JDWLABS-107, got %q", key) - } - if !transitioned { - t.Fatal("expected the Done issue to be transitioned back to an open status") - } - if !commented { - t.Fatal("expected a comment on the reopened issue") - } -} - -func TestJiraUpsertSearchErrorsOnServerError(t *testing.T) { - created := false - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - switch { - case r.Method == http.MethodGet && strings.HasPrefix(r.URL.Path, "/rest/api/3/search"): - w.WriteHeader(http.StatusInternalServerError) - case r.Method == http.MethodPost && r.URL.Path == "/rest/api/3/issue": - created = true - w.WriteHeader(http.StatusCreated) - _ = json.NewEncoder(w).Encode(map[string]string{"key": "JDWLABS-999"}) - } - })) - defer srv.Close() - - _, err := NewJiraClient(srv.URL, "e@x", "tok", "JDWLABS", "Task", srv.Client()). - Upsert(context.Background(), Alert{Fingerprint: "fp1", Labels: map[string]string{"alertname": "X"}}, Analysis{RootCause: "y"}) - if err == nil { - t.Fatal("expected error when search returns 500, got nil") - } - if created { - t.Fatal("create must not be attempted after a failed search") - } -} - -func TestJiraUpsertCreateErrorsOnServerError(t *testing.T) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Authorization") == "" { - t.Errorf("missing Authorization header on %s %s", r.Method, r.URL.Path) - } - switch { - case r.Method == http.MethodGet && strings.HasPrefix(r.URL.Path, "/rest/api/3/search"): - _ = json.NewEncoder(w).Encode(map[string]any{"issues": []any{}}) - case r.Method == http.MethodPost && r.URL.Path == "/rest/api/3/issue": - w.WriteHeader(http.StatusInternalServerError) - default: - t.Errorf("unexpected %s %s", r.Method, r.URL.Path) - } - })) - defer srv.Close() - - key, err := NewJiraClient(srv.URL, "e@x", "tok", "JDWLABS", "Task", srv.Client()). - Upsert(context.Background(), Alert{Fingerprint: "fp1", Labels: map[string]string{"alertname": "X"}}, Analysis{RootCause: "y"}) - if err == nil { - t.Fatalf("expected error on server failure, got key=%q", key) - } -} diff --git a/apps/backend/ai-sre-relay/main.go b/apps/backend/ai-sre-relay/main.go deleted file mode 100644 index 5b697c3e7..000000000 --- a/apps/backend/ai-sre-relay/main.go +++ /dev/null @@ -1,113 +0,0 @@ -package main - -import ( - "context" - "errors" - "log/slog" - "net/http" - "os" - "os/signal" - "strconv" - "syscall" - "time" -) - -func env(key, fallback string) string { - if v := os.Getenv(key); v != "" { - return v - } - return fallback -} - -func envInt(key string, fallback int) int { - if v := os.Getenv(key); v != "" { - if n, err := strconv.Atoi(v); err == nil && n > 0 { - return n - } - } - return fallback -} - -func mustEnv(key string) string { - v := os.Getenv(key) - if v == "" { - slog.Error("missing required env var", "key", key) - os.Exit(1) - } - return v -} - -func main() { - log := slog.New(slog.NewJSONHandler(os.Stdout, nil)) - slog.SetDefault(log) - - // Output posts (Discord/Jira/GitHub) get a tight per-request cap. LLM-bound - // calls (Holmes investigation, patch generation) legitimately run for - // minutes on slow backends, so their client carries no timeout of its own — - // the dispatcher's per-alert context (INVESTIGATION_TIMEOUT_SECONDS) is - // their only deadline. - hc := &http.Client{Timeout: 90 * time.Second} - llmc := &http.Client{} - - holmes := NewHolmesClient( - env("HOLMES_URL", "http://platform-holmes-holmes.ai-sre.svc.cluster.local"), - env("LITELLM_MODEL", "claude-sonnet"), - llmc, - ) - patchGen := NewPatchGenerator( - env("LITELLM_URL", "http://platform-litellm.ai-sre.svc.cluster.local:4000/v1"), - mustEnv("LITELLM_KEY"), - env("LITELLM_MODEL", "claude-sonnet"), - 0.75, llmc, - ) - jiraURL := mustEnv("JIRA_URL") - discord := NewDiscordNotifier(mustEnv("DISCORD_WEBHOOK_URL"), jiraURL, hc) - // "Task" not "Bug": the target project's type scheme has no Bug type and - // Jira rejects creates with an unknown type (400). - jira := NewJiraClient(jiraURL, mustEnv("JIRA_USERNAME"), mustEnv("JIRA_API_TOKEN"), env("JIRA_PROJECT", "JDWLABS"), env("JIRA_ISSUE_TYPE", "Task"), hc) - github := NewGitHubClient(env("GITHUB_API", "https://api.github.com"), mustEnv("GITHUB_TOKEN"), hc) - - pipeline := NewPipeline(holmes, patchGen, jira, github, discord, log) - - workers := envInt("MAX_CONCURRENT", 4) - queueSize := envInt("QUEUE_SIZE", 64) - perAlertTO := time.Duration(envInt("INVESTIGATION_TIMEOUT_SECONDS", 240)) * time.Second - disp := newDispatcher(pipeline, workers, queueSize, perAlertTO, log) - - webhookToken := os.Getenv("WEBHOOK_TOKEN") - if webhookToken == "" { - // ClusterIP limits exposure, but the downstream is paid/side-effecting; - // an authenticated webhook is the intended posture. - log.Warn("WEBHOOK_TOKEN unset; /webhook accepts any in-cluster caller") - } - - srv := &http.Server{ - Addr: ":" + env("PORT", "8080"), - Handler: newRouter(disp, webhookToken), - ReadHeaderTimeout: 10 * time.Second, - ReadTimeout: 15 * time.Second, - WriteTimeout: 15 * time.Second, - IdleTimeout: 60 * time.Second, - } - - go func() { - log.Info("relay listening", "addr", srv.Addr, "workers", workers, "queue", queueSize) - if err := srv.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { - log.Error("server error", "err", err) - os.Exit(1) - } - }() - - stop := make(chan os.Signal, 1) - signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM) - <-stop - log.Info("shutting down") - - ctx, cancel := context.WithTimeout(context.Background(), 25*time.Second) - defer cancel() - // Stop accepting new webhooks first, then drain in-flight investigations so - // a rolling update does not silently discard work already accepted. - _ = srv.Shutdown(ctx) - disp.shutdown(ctx) - log.Info("shutdown complete") -} diff --git a/apps/backend/ai-sre-relay/patch.go b/apps/backend/ai-sre-relay/patch.go deleted file mode 100644 index 839382df8..000000000 --- a/apps/backend/ai-sre-relay/patch.go +++ /dev/null @@ -1,87 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "strings" -) - -type PatchGenerator struct { - baseURL string - apiKey string - model string - minConfidence float64 - hc *http.Client -} - -func NewPatchGenerator(baseURL, apiKey, model string, minConfidence float64, hc *http.Client) *PatchGenerator { - if hc == nil { - hc = http.DefaultClient - } - return &PatchGenerator{baseURL: baseURL, apiKey: apiKey, model: model, minConfidence: minConfidence, hc: hc} -} - -const patchSystemPrompt = `You are an SRE assistant. Given a root-cause analysis, propose AT MOST ONE single-file GitOps change that fixes it. Respond with ONLY a JSON object, no prose, matching: -{"repo":"owner/name","file_path":"...","new_content":"","branch":"fix/...","rationale":"...","confidence":0.0-1.0} -If no safe single-file change exists, respond with exactly: {"confidence":0}` - -type openAIRequest struct { - Model string `json:"model"` - Messages []openAIMessage `json:"messages"` -} -type openAIMessage struct { - Role string `json:"role"` - Content string `json:"content"` -} -type openAIResponse struct { - Choices []struct { - Message openAIMessage `json:"message"` - } `json:"choices"` -} - -// Generate returns (nil, nil) for the common "no confident patch" case; an -// error only for transport/decode failures of the LiteLLM call itself. -func (g *PatchGenerator) Generate(ctx context.Context, an Analysis) (*Patch, error) { - reqBody, _ := json.Marshal(openAIRequest{ - Model: g.model, - Messages: []openAIMessage{ - {Role: "system", Content: patchSystemPrompt}, - {Role: "user", Content: an.RootCause}, - }, - }) - req, err := http.NewRequestWithContext(ctx, http.MethodPost, g.baseURL+"/chat/completions", bytes.NewReader(reqBody)) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+g.apiKey) - resp, err := g.hc.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("litellm: status %d", resp.StatusCode) - } - var or openAIResponse - if err := json.NewDecoder(resp.Body).Decode(&or); err != nil { - return nil, fmt.Errorf("litellm: decode: %w", err) - } - if len(or.Choices) == 0 { - return nil, nil - } - content := strings.TrimSpace(or.Choices[0].Message.Content) - - // Malformed / refusal → no patch (not an error). Only accept strict JSON. - var p Patch - if err := json.Unmarshal([]byte(content), &p); err != nil { - return nil, nil - } - if p.Confidence < g.minConfidence || strings.TrimSpace(p.Repo) == "" || strings.TrimSpace(p.FilePath) == "" || strings.TrimSpace(p.NewContent) == "" { - return nil, nil - } - return &p, nil -} diff --git a/apps/backend/ai-sre-relay/patch_test.go b/apps/backend/ai-sre-relay/patch_test.go deleted file mode 100644 index db1cc8149..000000000 --- a/apps/backend/ai-sre-relay/patch_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "net/http" - "net/http/httptest" - "testing" -) - -// fakeLiteLLM returns an OpenAI-shaped chat completion whose message content -// is the given string (the model's raw reply). -func fakeLiteLLM(t *testing.T, content string) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Authorization") != "Bearer test-key" { - t.Errorf("missing/wrong auth: %q", r.Header.Get("Authorization")) - } - resp := map[string]any{"choices": []map[string]any{{"message": map[string]string{"content": content}}}} - _ = json.NewEncoder(w).Encode(resp) - })) -} - -func TestPatchGenerateValid(t *testing.T) { - patch := `{"repo":"jdwlabs/platform","file_path":"values.yaml","new_content":"limits:\n memory: 512Mi\n","branch":"fix/oom","rationale":"raise limit","confidence":0.9}` - srv := fakeLiteLLM(t, patch) - defer srv.Close() - g := NewPatchGenerator(srv.URL, "test-key", "claude-sonnet", 0.7, srv.Client()) - got, err := g.Generate(context.Background(), Analysis{RootCause: "OOM"}) - if err != nil { - t.Fatal(err) - } - if got == nil || got.Repo != "jdwlabs/platform" || got.Confidence != 0.9 { - t.Fatalf("bad patch: %+v", got) - } -} - -func TestPatchGenerateLowConfidenceReturnsNil(t *testing.T) { - srv := fakeLiteLLM(t, `{"repo":"x/y","file_path":"a","new_content":"b","branch":"c","rationale":"d","confidence":0.3}`) - defer srv.Close() - got, err := NewPatchGenerator(srv.URL, "test-key", "m", 0.7, srv.Client()).Generate(context.Background(), Analysis{}) - if err != nil || got != nil { - t.Fatalf("want (nil,nil), got (%+v,%v)", got, err) - } -} - -func TestPatchGenerateMalformedReturnsNil(t *testing.T) { - srv := fakeLiteLLM(t, "sorry, I cannot produce a patch") - defer srv.Close() - got, err := NewPatchGenerator(srv.URL, "test-key", "m", 0.7, srv.Client()).Generate(context.Background(), Analysis{}) - if err != nil || got != nil { - t.Fatalf("want (nil,nil), got (%+v,%v)", got, err) - } -} diff --git a/apps/backend/ai-sre-relay/pipeline.go b/apps/backend/ai-sre-relay/pipeline.go deleted file mode 100644 index 435c08eba..000000000 --- a/apps/backend/ai-sre-relay/pipeline.go +++ /dev/null @@ -1,86 +0,0 @@ -package main - -import ( - "context" - "log/slog" - "time" -) - -type holmesInvestigator interface { - Investigate(ctx context.Context, a Alert) (Analysis, error) -} -type patcher interface { - Generate(ctx context.Context, an Analysis) (*Patch, error) -} -type jiraUpserter interface { - Upsert(ctx context.Context, a Alert, an Analysis) (IssueKey, error) -} -type prOpener interface { - OpenPR(ctx context.Context, p Patch, issue IssueKey) (PRLink, error) -} -type discordNotifier interface { - Notify(ctx context.Context, a Alert, an Analysis, issue IssueKey, pr *PRLink, patch *Patch) error -} - -type Pipeline struct { - holmes holmesInvestigator - patch patcher - jira jiraUpserter - github prOpener - discord discordNotifier - log *slog.Logger -} - -func NewPipeline(h holmesInvestigator, pg patcher, j jiraUpserter, gh prOpener, d discordNotifier, log *slog.Logger) *Pipeline { - return &Pipeline{holmes: h, patch: pg, jira: j, github: gh, discord: d, log: log} -} - -// Handle runs one alert through the pipeline. Each output is independent: a -// failure is logged with the fingerprint and never suppresses later outputs. -func (p *Pipeline) Handle(ctx context.Context, a Alert) error { - log := p.log.With("fingerprint", a.Fingerprint, "alert", a.Name()) - - an, err := p.holmes.Investigate(ctx, a) - if err != nil { - // Holmes is terminal: nothing to fan out. Still tell humans so they - // are not left blind. The per-alert context is usually already dead - // here (deadline expired mid-investigation), so the notice gets a - // short-lived context of its own. - log.Error("holmes investigation failed", "err", err) - nctx, ncancel := context.WithTimeout(context.WithoutCancel(ctx), 30*time.Second) - defer ncancel() - if derr := p.discord.Notify(nctx, a, Analysis{RootCause: "⚠️ investigation failed: " + err.Error()}, "", nil, nil); derr != nil { - log.Error("discord failure notice failed", "err", derr) - } - return err - } - - // Structured patch is best-effort; nil is the common case. - var patch *Patch - if pt, perr := p.patch.Generate(ctx, an); perr != nil { - log.Error("patch generation failed", "err", perr) - } else { - patch = pt - } - - var issue IssueKey - if k, jerr := p.jira.Upsert(ctx, a, an); jerr != nil { - log.Error("jira upsert failed", "err", jerr) - } else { - issue = k - } - - var prLink *PRLink - if patch != nil { - if link, gerr := p.github.OpenPR(ctx, *patch, issue); gerr != nil { - log.Error("github pr failed", "err", gerr) - } else { - prLink = &link - } - } - - if derr := p.discord.Notify(ctx, a, an, issue, prLink, patch); derr != nil { - log.Error("discord notify failed", "err", derr) - } - return nil -} diff --git a/apps/backend/ai-sre-relay/pipeline_test.go b/apps/backend/ai-sre-relay/pipeline_test.go deleted file mode 100644 index 75fd12e12..000000000 --- a/apps/backend/ai-sre-relay/pipeline_test.go +++ /dev/null @@ -1,165 +0,0 @@ -package main - -import ( - "context" - "errors" - "io" - "log/slog" - "testing" -) - -type fakeHolmes struct { - an Analysis - err error -} - -func (f fakeHolmes) Investigate(context.Context, Alert) (Analysis, error) { return f.an, f.err } - -type fakePatcher struct{ p *Patch } - -func (f fakePatcher) Generate(context.Context, Analysis) (*Patch, error) { return f.p, nil } - -type fakeJira struct { - key IssueKey - called bool -} - -func (f *fakeJira) Upsert(context.Context, Alert, Analysis) (IssueKey, error) { - f.called = true - return f.key, nil -} - -type fakeGH struct{ called bool } - -func (f *fakeGH) OpenPR(context.Context, Patch, IssueKey) (PRLink, error) { - f.called = true - return "http://pr/1", nil -} - -type fakeDiscord struct { - called bool - pr *PRLink -} - -func (f *fakeDiscord) Notify(_ context.Context, _ Alert, _ Analysis, _ IssueKey, pr *PRLink, _ *Patch) error { - f.called = true - f.pr = pr - return nil -} - -func silentLogger() *slog.Logger { return slog.New(slog.NewTextHandler(io.Discard, nil)) } - -func TestPipelineHappyPathOpensPR(t *testing.T) { - j, gh, d := &fakeJira{key: "JDWLABS-1"}, &fakeGH{}, &fakeDiscord{} - p := NewPipeline(fakeHolmes{an: Analysis{RootCause: "x"}}, fakePatcher{p: &Patch{Repo: "a/b"}}, j, gh, d, silentLogger()) - if err := p.Handle(context.Background(), Alert{Fingerprint: "f"}); err != nil { - t.Fatal(err) - } - if !j.called || !gh.called || !d.called || d.pr == nil { - t.Fatalf("steps: jira=%v gh=%v discord=%v pr=%v", j.called, gh.called, d.called, d.pr) - } -} - -func TestPipelineNoPatchSkipsPR(t *testing.T) { - gh, d := &fakeGH{}, &fakeDiscord{} - p := NewPipeline(fakeHolmes{an: Analysis{RootCause: "x"}}, fakePatcher{p: nil}, &fakeJira{key: "JDWLABS-2"}, gh, d, silentLogger()) - _ = p.Handle(context.Background(), Alert{}) - if gh.called { - t.Fatal("PR opened despite nil patch") - } - if !d.called || d.pr != nil { - t.Fatal("discord should fire with nil PR link") - } -} - -func TestPipelineHolmesFailureStillNotifies(t *testing.T) { - d := &fakeDiscord{} - p := NewPipeline(fakeHolmes{err: errors.New("down")}, fakePatcher{}, &fakeJira{}, &fakeGH{}, d, silentLogger()) - _ = p.Handle(context.Background(), Alert{}) - if !d.called { - t.Fatal("expected failure notice to Discord") - } -} - -type ctxCheckingDiscord struct { - called bool - ctxErr error -} - -func (f *ctxCheckingDiscord) Notify(ctx context.Context, _ Alert, _ Analysis, _ IssueKey, _ *PRLink, _ *Patch) error { - f.called = true - f.ctxErr = ctx.Err() - return f.ctxErr -} - -// The usual way Holmes fails is the per-alert deadline expiring mid -// investigation — the same dead context must not also kill the notice that -// tells humans about it. -func TestPipelineFailureNoticeSurvivesDeadContext(t *testing.T) { - d := &ctxCheckingDiscord{} - p := NewPipeline(fakeHolmes{err: errors.New("deadline exceeded")}, fakePatcher{}, &fakeJira{}, &fakeGH{}, d, silentLogger()) - ctx, cancel := context.WithCancel(context.Background()) - cancel() - _ = p.Handle(ctx, Alert{Fingerprint: "f"}) - if !d.called || d.ctxErr != nil { - t.Fatalf("failure notice must run on a live context: called=%v ctxErr=%v", d.called, d.ctxErr) - } -} - -type fakeJiraErr struct{} - -func (fakeJiraErr) Upsert(context.Context, Alert, Analysis) (IssueKey, error) { - return "", errors.New("jira down") -} - -func TestPipelineJiraFailureStillNotifiesDiscord(t *testing.T) { - d := &fakeDiscord{} - p := NewPipeline(fakeHolmes{an: Analysis{RootCause: "x"}}, fakePatcher{p: nil}, fakeJiraErr{}, &fakeGH{}, d, silentLogger()) - if err := p.Handle(context.Background(), Alert{Fingerprint: "fp"}); err != nil { - t.Fatal(err) - } - if !d.called { - t.Fatal("discord must fire even when jira fails") - } -} - -type fakeGHErr struct{} - -func (fakeGHErr) OpenPR(context.Context, Patch, IssueKey) (PRLink, error) { - return "", errors.New("github down") -} - -func TestPipelineGithubFailureStillNotifiesDiscord(t *testing.T) { - d := &fakeDiscord{} - patch := &Patch{Repo: "a/b", FilePath: "f", NewContent: "c", Branch: "fix/x", Rationale: "r", Confidence: 0.9} - p := NewPipeline(fakeHolmes{an: Analysis{RootCause: "x"}}, fakePatcher{p: patch}, &fakeJira{key: "JDWLABS-3"}, fakeGHErr{}, d, silentLogger()) - if err := p.Handle(context.Background(), Alert{Fingerprint: "fp"}); err != nil { - t.Fatal(err) - } - if !d.called { - t.Fatal("discord must fire even when github fails") - } - if d.pr != nil { - t.Fatalf("PR link must be nil when github fails, got %v", d.pr) - } -} - -type fakePatcherErr struct{} - -func (fakePatcherErr) Generate(context.Context, Analysis) (*Patch, error) { - return nil, errors.New("no patch") -} - -func TestPipelinePatchErrorStillContinues(t *testing.T) { - d, gh := &fakeDiscord{}, &fakeGH{} - p := NewPipeline(fakeHolmes{an: Analysis{RootCause: "x"}}, fakePatcherErr{}, &fakeJira{key: "ABC-1"}, gh, d, silentLogger()) - if err := p.Handle(context.Background(), Alert{}); err != nil { - t.Fatal(err) - } - if gh.called { - t.Fatal("PR must be skipped when patch generation errors") - } - if !d.called { - t.Fatal("discord must still fire after a patch error") - } -} diff --git a/apps/backend/ai-sre-relay/project.json b/apps/backend/ai-sre-relay/project.json deleted file mode 100644 index d12cbb878..000000000 --- a/apps/backend/ai-sre-relay/project.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ai-sre-relay", - "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "projectType": "application", - "sourceRoot": "apps/backend/ai-sre-relay", - "tags": ["type:app", "scope:ai-sre-relay", "framework:go"], - "release": { - "version": { - "versionActions": "./tools/release/text-file-version-actions.ts" - } - }, - "targets": { - "build": { - "executor": "@nx-go/nx-go:build", - "options": { - "main": ".", - "outputPath": "../../../dist/apps/backend/ai-sre-relay/ai-sre-relay" - } - }, - "serve": { "executor": "@nx-go/nx-go:serve", "options": { "main": "." } }, - "test": { "executor": "@nx-go/nx-go:test" }, - "lint": { "executor": "@nx-go/nx-go:lint" }, - "tidy": { "executor": "@nx-go/nx-go:tidy" }, - "build-image": { - "executor": "nx:run-commands", - "options": { - "commands": [ - { - "command": "docker buildx build --platform linux/amd64,linux/arm64 -f {projectRoot}/Dockerfile -t jdwlabs/ai-sre-relay:latest -t jdwlabs/ai-sre-relay:\"$(tr -d '[:space:]' < apps/backend/ai-sre-relay/VERSION)\" --push .", - "forwardAllArgs": false - } - ], - "parallel": false - } - }, - "local-build-image": { - "executor": "nx:run-commands", - "options": { - "commands": [ - { - "command": "docker buildx build -f {projectRoot}/Dockerfile.local -t jdwlabs/ai-sre-relay:latest --load .", - "forwardAllArgs": false - } - ], - "parallel": false - } - }, - "download": { "command": "go mod download" } - } -} diff --git a/apps/backend/ai-sre-relay/types.go b/apps/backend/ai-sre-relay/types.go deleted file mode 100644 index 5ce4a8799..000000000 --- a/apps/backend/ai-sre-relay/types.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -// Alert is one firing alert from an Alertmanager v4 webhook. -type Alert struct { - Fingerprint string `json:"fingerprint"` - Status string `json:"status"` - Labels map[string]string `json:"labels"` - Annotations map[string]string `json:"annotations"` - StartsAt string `json:"startsAt"` -} - -func (a Alert) Name() string { return a.Labels["alertname"] } -func (a Alert) Namespace() string { return a.Labels["namespace"] } -func (a Alert) Severity() string { return a.Labels["severity"] } - -// Analysis is Holmes' prose root-cause output. -type Analysis struct { - RootCause string // full markdown analysis -} - -// Patch is a machine-readable, single-file remediation proposal. -type Patch struct { - Repo string `json:"repo"` // "owner/name" - FilePath string `json:"file_path"` // path within repo - NewContent string `json:"new_content"` // full new file contents - Branch string `json:"branch"` - Rationale string `json:"rationale"` - Confidence float64 `json:"confidence"` // 0..1 -} - -// IssueKey is a Jira issue identifier, e.g. "ABC-123". -type IssueKey string - -// PRLink is a rendered GitHub pull request URL. -type PRLink string diff --git a/apps/backend/ai-sre-relay/types_test.go b/apps/backend/ai-sre-relay/types_test.go deleted file mode 100644 index 89bae5932..000000000 --- a/apps/backend/ai-sre-relay/types_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package main - -import ( - "encoding/json" - "testing" -) - -func TestAlertDecodesFingerprintAndLabels(t *testing.T) { - const payload = `{ - "fingerprint": "abc123", - "status": "firing", - "labels": {"alertname": "KubePodCrashLooping", "namespace": "prod", "severity": "warning"}, - "annotations": {"description": "pod restarting"}, - "startsAt": "2026-06-30T00:00:00Z" - }` - var a Alert - if err := json.Unmarshal([]byte(payload), &a); err != nil { - t.Fatal(err) - } - if a.Fingerprint != "abc123" || a.Labels["alertname"] != "KubePodCrashLooping" { - t.Fatalf("bad decode: %+v", a) - } - if a.Name() != "KubePodCrashLooping" || a.Namespace() != "prod" || a.Severity() != "warning" { - t.Fatalf("accessor mismatch: %+v", a) - } -} diff --git a/apps/backend/ai-sre-relay/webhook.go b/apps/backend/ai-sre-relay/webhook.go deleted file mode 100644 index 44258d15e..000000000 --- a/apps/backend/ai-sre-relay/webhook.go +++ /dev/null @@ -1,67 +0,0 @@ -package main - -import ( - "crypto/subtle" - "encoding/json" - "net/http" -) - -// maxWebhookBytes caps the request body. Alertmanager batches are small; the -// cap guards the memory-capped replica against an oversized/malicious payload. -const maxWebhookBytes = 1 << 20 // 1 MiB - -// enqueuer is the seam to the worker pool; the HTTP layer depends only on this. -type enqueuer interface { - enqueue(a Alert) bool -} - -func newRouter(e enqueuer, webhookToken string) http.Handler { - mux := http.NewServeMux() - mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("ok")) - }) - mux.HandleFunc("POST /webhook", func(w http.ResponseWriter, r *http.Request) { - r.Body = http.MaxBytesReader(w, r.Body, maxWebhookBytes) - var payload struct { - Alerts []Alert `json:"alerts"` - } - if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { - http.Error(w, "bad payload", http.StatusBadRequest) - return - } - // Return 202 fast so Alertmanager is not held open for the full - // investigation; the worker pool does the slow work asynchronously. - for _, a := range payload.Alerts { - if a.Status == "firing" { - e.enqueue(a) - } - } - w.WriteHeader(http.StatusAccepted) - }) - return withAuth(mux, webhookToken) -} - -// withAuth enforces a bearer token on the expensive/side-effecting routes when -// a token is configured, leaving /healthz open for kubelet probes. The Service -// is ClusterIP, but the downstream (paid LLM calls, Jira issues, GitHub PRs) -// warrants defense-in-depth against any in-cluster caller. When no token is set -// the mux is returned unwrapped (startup logs a warning). -func withAuth(next http.Handler, token string) http.Handler { - if token == "" { - return next - } - want := []byte("Bearer " + token) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path == "/healthz" { - next.ServeHTTP(w, r) - return - } - // Constant-time compare to avoid leaking the token via response timing. - if subtle.ConstantTimeCompare([]byte(r.Header.Get("Authorization")), want) != 1 { - http.Error(w, "unauthorized", http.StatusUnauthorized) - return - } - next.ServeHTTP(w, r) - }) -} diff --git a/apps/backend/ai-sre-relay/webhook_test.go b/apps/backend/ai-sre-relay/webhook_test.go deleted file mode 100644 index 94a2c0c45..000000000 --- a/apps/backend/ai-sre-relay/webhook_test.go +++ /dev/null @@ -1,89 +0,0 @@ -package main - -import ( - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -type fakeEnqueuer struct{ got []Alert } - -func (f *fakeEnqueuer) enqueue(a Alert) bool { f.got = append(f.got, a); return true } - -func TestHealthz(t *testing.T) { - rr := httptest.NewRecorder() - req := httptest.NewRequest(http.MethodGet, "/healthz", nil) - newRouter(&fakeEnqueuer{}, "").ServeHTTP(rr, req) - if rr.Code != http.StatusOK { - t.Fatalf("healthz = %d, want 200", rr.Code) - } - if got := rr.Body.String(); got != "ok" { - t.Errorf("healthz body = %q, want \"ok\"", got) - } -} - -func TestWebhookEnqueuesOnlyFiringAlerts(t *testing.T) { - e := &fakeEnqueuer{} - const payload = `{"alerts":[ - {"status":"firing","fingerprint":"f1","labels":{"alertname":"A"}}, - {"status":"resolved","fingerprint":"f2","labels":{"alertname":"B"}} - ]}` - rr := httptest.NewRecorder() - req := httptest.NewRequest(http.MethodPost, "/webhook", strings.NewReader(payload)) - newRouter(e, "").ServeHTTP(rr, req) - - if rr.Code != http.StatusAccepted { - t.Fatalf("code = %d, want 202", rr.Code) - } - if len(e.got) != 1 || e.got[0].Fingerprint != "f1" { - t.Fatalf("enqueued = %+v, want only f1", e.got) - } -} - -func TestWebhookBadPayload(t *testing.T) { - rr := httptest.NewRecorder() - req := httptest.NewRequest(http.MethodPost, "/webhook", strings.NewReader("{not json")) - newRouter(&fakeEnqueuer{}, "").ServeHTTP(rr, req) - if rr.Code != http.StatusBadRequest { - t.Fatalf("code = %d, want 400", rr.Code) - } -} - -func TestWebhookAuth(t *testing.T) { - const token = "s3cret" - const payload = `{"alerts":[{"status":"firing","fingerprint":"f1","labels":{"alertname":"A"}}]}` - - // Missing token -> 401, nothing enqueued. - e := &fakeEnqueuer{} - rr := httptest.NewRecorder() - req := httptest.NewRequest(http.MethodPost, "/webhook", strings.NewReader(payload)) - newRouter(e, token).ServeHTTP(rr, req) - if rr.Code != http.StatusUnauthorized { - t.Fatalf("missing-token code = %d, want 401", rr.Code) - } - if len(e.got) != 0 { - t.Fatalf("unauthorized request must not enqueue: %+v", e.got) - } - - // Correct token -> 202, enqueued. - e2 := &fakeEnqueuer{} - rr2 := httptest.NewRecorder() - req2 := httptest.NewRequest(http.MethodPost, "/webhook", strings.NewReader(payload)) - req2.Header.Set("Authorization", "Bearer "+token) - newRouter(e2, token).ServeHTTP(rr2, req2) - if rr2.Code != http.StatusAccepted { - t.Fatalf("token code = %d, want 202", rr2.Code) - } - if len(e2.got) != 1 { - t.Fatalf("authorized request must enqueue one, got %+v", e2.got) - } - - // Healthz stays open even when a token is configured (kubelet probes). - rr3 := httptest.NewRecorder() - req3 := httptest.NewRequest(http.MethodGet, "/healthz", nil) - newRouter(&fakeEnqueuer{}, token).ServeHTTP(rr3, req3) - if rr3.Code != http.StatusOK { - t.Fatalf("healthz with token = %d, want 200", rr3.Code) - } -} diff --git a/apps/backend/servicediscovery/CHANGELOG.md b/apps/backend/servicediscovery/CHANGELOG.md index 048ce6d1c..da0fedbb5 100644 --- a/apps/backend/servicediscovery/CHANGELOG.md +++ b/apps/backend/servicediscovery/CHANGELOG.md @@ -1,33 +1,7 @@ -# 1.0.0 (2026-07-10) - -### 🚀 Features - -- **apps:** enrich all images with OCI labels and Overview sync ([74feb95c](https://github.com/jdwlabs/apps/commit/74feb95c)) - -### 🩹 Fixes - -- **structure:** fix stale paths missed during role-based restructure ([a012da32](https://github.com/jdwlabs/apps/commit/a012da32)) - -### ❤️ Thank You - -- Claude Opus 4.8 -- Claude Sonnet 4.6 -- Jake Willmsen @jdwillmsen - -## 0.5.1 (2026-07-05) - -This was a version bump only for servicediscovery to align it with other projects, there were no code changes. - # Changelog This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). -## [0.5.0](https://github.com/jdwlabs/apps/compare/servicediscovery-0.4.3...servicediscovery-0.5.0) (2026-07-01) - -### Features - -- **apps:** enrich all images with OCI labels and Overview sync ([bfd1325](https://github.com/jdwlabs/apps/commit/bfd1325172d58ceb042b9eb2994f1105d1cdce53)) - ## [0.4.3](https://github.com/jdwlabs/apps/compare/servicediscovery-0.4.2...servicediscovery-0.4.3) (2026-06-08) ### Bug Fixes diff --git a/apps/backend/servicediscovery/README.docker.md b/apps/backend/servicediscovery/README.docker.md deleted file mode 100644 index e0f2f693a..000000000 --- a/apps/backend/servicediscovery/README.docker.md +++ /dev/null @@ -1,54 +0,0 @@ -# jdwlabs/servicediscovery - -Micro-frontend **service discovery API** for the jdwlabs platform. - -![Docker Image Version](https://img.shields.io/docker/v/jdwlabs/servicediscovery?sort=semver) -![Docker Image Size](https://img.shields.io/docker/image-size/jdwlabs/servicediscovery/latest) -![Docker Pulls](https://img.shields.io/docker/pulls/jdwlabs/servicediscovery) - -## What it is - -A small Go service that tells the `jdwlabs/container` host shell which micro-frontend -remotes exist and where to load them from. It serves the remote map and the -micro-frontend catalog (name, route, icon, title) that drive the platform's runtime -module-federation wiring. Built on distroless for a minimal attack surface. - -## Quick start - -```bash -docker run -p 9000:9000 jdwlabs/servicediscovery:latest -curl http://localhost:9000/health -``` - -## Exposed ports - -| Port | Purpose | -| ------ | -------- | -| `9000` | HTTP API | - -## Endpoints - -| Method / Path | Purpose | -| -------------------------- | -------------------------------- | -| `GET /health` | Liveness/readiness check | -| `GET /version` | Running build version | -| `GET /api/remotes` | Module-federation remote URL map | -| `GET /api/micro-frontends` | Micro-frontend catalog | - -## Environment variables - -| Name | Default | Purpose | -| --------- | ------- | ---------------- | -| `SD_PORT` | `9000` | HTTP listen port | - -## Tags - -| Tag | Meaning | -| ----------- | ------------------------------ | -| `latest` | most recent release | -| `{version}` | specific semver (e.g. `1.2.3`) | - -## Source & license - -Source: -License: PolyForm Noncommercial 1.0.0 diff --git a/apps/backend/servicediscovery/VERSION b/apps/backend/servicediscovery/VERSION deleted file mode 100644 index 3eefcb9dd..000000000 --- a/apps/backend/servicediscovery/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.0.0 diff --git a/apps/backend/servicediscovery/project.json b/apps/backend/servicediscovery/project.json index 1c9be665d..c22764b48 100644 --- a/apps/backend/servicediscovery/project.json +++ b/apps/backend/servicediscovery/project.json @@ -4,11 +4,6 @@ "projectType": "application", "sourceRoot": "apps/backend/servicediscovery", "tags": ["type:app", "scope:servicediscovery", "framework:go"], - "release": { - "version": { - "versionActions": "./tools/release/text-file-version-actions.ts" - } - }, "targets": { "build": { "executor": "@nx-go/nx-go:build", @@ -37,7 +32,7 @@ "options": { "commands": [ { - "command": "bash scripts/build-image.sh servicediscovery \"$(tr -d '[:space:]' < apps/backend/servicediscovery/VERSION)\" {projectRoot}/Dockerfile \"Micro-frontend service discovery API for the jdwlabs platform\" --platform linux/amd64,linux/arm64 --push", + "command": "docker buildx build --platform linux/amd64,linux/arm64 -f {projectRoot}/Dockerfile -t jdwlabs/servicediscovery:latest -t jdwlabs/servicediscovery:{version} --push .", "forwardAllArgs": false } ], @@ -49,7 +44,7 @@ "options": { "commands": [ { - "command": "bash scripts/build-image.sh servicediscovery local {projectRoot}/Dockerfile.local \"Micro-frontend service discovery API for the jdwlabs platform\" --load", + "command": "docker buildx build -f {projectRoot}/Dockerfile.local -t jdwlabs/servicediscovery:latest --load .", "forwardAllArgs": false } ], @@ -68,11 +63,19 @@ "parallel": false } }, - "update-app": { - "command": "bash scripts/update-app.sh charts/servicediscovery/Chart.yaml \"$(tr -d '[:space:]' < apps/backend/servicediscovery/VERSION)\" {projectName}" + "version": { + "executor": "@jscutlery/semver:version", + "options": { + "push": true, + "preset": "conventionalcommits", + "postTargets": ["format", "build-image", "update-app"] + } }, - "update-description": { - "command": "bash scripts/update-description.sh jdwlabs/servicediscovery {projectRoot}/README.docker.md" + "format": { + "command": "bash scripts/format.sh" + }, + "update-app": { + "command": "bash scripts/update-app.sh charts/servicediscovery/Chart.yaml {version} {projectName}" }, "download": { "command": "go mod download" diff --git a/apps/backend/usersrole/CHANGELOG.md b/apps/backend/usersrole/CHANGELOG.md index 240a05cbf..b3165f281 100644 --- a/apps/backend/usersrole/CHANGELOG.md +++ b/apps/backend/usersrole/CHANGELOG.md @@ -1,120 +1,7 @@ -# 1.0.0 (2026-07-10) - -### 🚀 Features - -- **apps:** enrich all images with OCI labels and Overview sync ([74feb95c](https://github.com/jdwlabs/apps/commit/74feb95c)) - -### 🩹 Fixes - -- **usersrole:** import Instant so build.gradle.kts compiles ([6720c591](https://github.com/jdwlabs/apps/commit/6720c591)) - -### ❤️ Thank You - -- Claude Opus 4.8 -- Jake Willmsen @jdwillmsen - # Changelog This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). -## [0.11.17](https://github.com/jdwlabs/apps/compare/usersrole-0.11.16...usersrole-0.11.17) (2026-07-04) - -## [0.11.16](https://github.com/jdwlabs/apps/compare/usersrole-0.11.15...usersrole-0.11.16) (2026-07-04) - -## [0.11.15](https://github.com/jdwlabs/apps/compare/usersrole-0.11.14...usersrole-0.11.15) (2026-07-04) - -## [0.11.14](https://github.com/jdwlabs/apps/compare/usersrole-0.11.13...usersrole-0.11.14) (2026-07-04) - -## [0.11.13](https://github.com/jdwlabs/apps/compare/usersrole-0.11.12...usersrole-0.11.13) (2026-07-04) - -## [0.11.12](https://github.com/jdwlabs/apps/compare/usersrole-0.11.11...usersrole-0.11.12) (2026-07-01) - -## [0.11.11](https://github.com/jdwlabs/apps/compare/usersrole-0.11.10...usersrole-0.11.11) (2026-07-01) - -## [0.11.10](https://github.com/jdwlabs/apps/compare/usersrole-0.11.9...usersrole-0.11.10) (2026-07-01) - -## [0.11.9](https://github.com/jdwlabs/apps/compare/usersrole-0.11.8...usersrole-0.11.9) (2026-07-01) - -## [0.11.8](https://github.com/jdwlabs/apps/compare/usersrole-0.11.7...usersrole-0.11.8) (2026-07-01) - -## [0.11.7](https://github.com/jdwlabs/apps/compare/usersrole-0.11.6...usersrole-0.11.7) (2026-07-01) - -## [0.11.6](https://github.com/jdwlabs/apps/compare/usersrole-0.11.5...usersrole-0.11.6) (2026-07-01) - -## [0.11.5](https://github.com/jdwlabs/apps/compare/usersrole-0.11.4...usersrole-0.11.5) (2026-07-01) - -## [0.11.4](https://github.com/jdwlabs/apps/compare/usersrole-0.11.3...usersrole-0.11.4) (2026-07-01) - -## [0.11.3](https://github.com/jdwlabs/apps/compare/usersrole-0.11.2...usersrole-0.11.3) (2026-07-01) - -## [0.11.2](https://github.com/jdwlabs/apps/compare/usersrole-0.11.1...usersrole-0.11.2) (2026-07-01) - -## [0.11.1](https://github.com/jdwlabs/apps/compare/usersrole-0.11.0...usersrole-0.11.1) (2026-07-01) - -## [0.11.0](https://github.com/jdwlabs/apps/compare/usersrole-0.10.42...usersrole-0.11.0) (2026-07-01) - -### Features - -- **apps:** enrich all images with OCI labels and Overview sync ([bfd1325](https://github.com/jdwlabs/apps/commit/bfd1325172d58ceb042b9eb2994f1105d1cdce53)) - -### Bug Fixes - -- **usersrole:** import Instant so build.gradle.kts compiles ([40a0571](https://github.com/jdwlabs/apps/commit/40a05712fc59f4c8a6823479d4a33313bf29cfa4)) - -## [0.10.42](https://github.com/jdwlabs/apps/compare/usersrole-0.10.41...usersrole-0.10.42) (2026-06-18) - -## [0.10.41](https://github.com/jdwlabs/apps/compare/usersrole-0.10.40...usersrole-0.10.41) (2026-06-18) - -## [0.10.40](https://github.com/jdwlabs/apps/compare/usersrole-0.10.39...usersrole-0.10.40) (2026-06-18) - -## [0.10.39](https://github.com/jdwlabs/apps/compare/usersrole-0.10.38...usersrole-0.10.39) (2026-06-18) - -## [0.10.38](https://github.com/jdwlabs/apps/compare/usersrole-0.10.37...usersrole-0.10.38) (2026-06-18) - -## [0.10.37](https://github.com/jdwlabs/apps/compare/usersrole-0.10.36...usersrole-0.10.37) (2026-06-18) - -## [0.10.36](https://github.com/jdwlabs/apps/compare/usersrole-0.10.35...usersrole-0.10.36) (2026-06-18) - -## [0.10.35](https://github.com/jdwlabs/apps/compare/usersrole-0.10.34...usersrole-0.10.35) (2026-06-17) - -## [0.10.34](https://github.com/jdwlabs/apps/compare/usersrole-0.10.33...usersrole-0.10.34) (2026-06-17) - -## [0.10.33](https://github.com/jdwlabs/apps/compare/usersrole-0.10.32...usersrole-0.10.33) (2026-06-17) - -## [0.10.32](https://github.com/jdwlabs/apps/compare/usersrole-0.10.31...usersrole-0.10.32) (2026-06-17) - -## [0.10.31](https://github.com/jdwlabs/apps/compare/usersrole-0.10.30...usersrole-0.10.31) (2026-06-17) - -## [0.10.30](https://github.com/jdwlabs/apps/compare/usersrole-0.10.29...usersrole-0.10.30) (2026-06-17) - -## [0.10.29](https://github.com/jdwlabs/apps/compare/usersrole-0.10.28...usersrole-0.10.29) (2026-06-17) - -## [0.10.28](https://github.com/jdwlabs/apps/compare/usersrole-0.10.27...usersrole-0.10.28) (2026-06-17) - -## [0.10.27](https://github.com/jdwlabs/apps/compare/usersrole-0.10.26...usersrole-0.10.27) (2026-06-17) - -## [0.10.26](https://github.com/jdwlabs/apps/compare/usersrole-0.10.25...usersrole-0.10.26) (2026-06-17) - -## [0.10.25](https://github.com/jdwlabs/apps/compare/usersrole-0.10.24...usersrole-0.10.25) (2026-06-17) - -## [0.10.24](https://github.com/jdwlabs/apps/compare/usersrole-0.10.23...usersrole-0.10.24) (2026-06-17) - -## [0.10.23](https://github.com/jdwlabs/apps/compare/usersrole-0.10.22...usersrole-0.10.23) (2026-06-17) - -## [0.10.22](https://github.com/jdwlabs/apps/compare/usersrole-0.10.21...usersrole-0.10.22) (2026-06-17) - -## [0.10.21](https://github.com/jdwlabs/apps/compare/usersrole-0.10.20...usersrole-0.10.21) (2026-06-17) - -## [0.10.20](https://github.com/jdwlabs/apps/compare/usersrole-0.10.19...usersrole-0.10.20) (2026-06-17) - -## [0.10.19](https://github.com/jdwlabs/apps/compare/usersrole-0.10.18...usersrole-0.10.19) (2026-06-17) - -## [0.10.18](https://github.com/jdwlabs/apps/compare/usersrole-0.10.17...usersrole-0.10.18) (2026-06-17) - -## [0.10.17](https://github.com/jdwlabs/apps/compare/usersrole-0.10.16...usersrole-0.10.17) (2026-06-17) - -## [0.10.16](https://github.com/jdwlabs/apps/compare/usersrole-0.10.15...usersrole-0.10.16) (2026-06-16) - ## [0.10.15](https://github.com/jdwlabs/apps/compare/usersrole-0.10.14...usersrole-0.10.15) (2026-06-10) ## [0.10.11](https://github.com/jdwlabs/apps/compare/usersrole-0.10.10...usersrole-0.10.11) (2026-05-26) diff --git a/apps/backend/usersrole/README.docker.md b/apps/backend/usersrole/README.docker.md deleted file mode 100644 index cdad2aa5f..000000000 --- a/apps/backend/usersrole/README.docker.md +++ /dev/null @@ -1,52 +0,0 @@ -# jdwlabs/usersrole - -Users & roles **backend service** for the jdwlabs platform. - -![Docker Image Version](https://img.shields.io/docker/v/jdwlabs/usersrole?sort=semver) -![Docker Image Size](https://img.shields.io/docker/image-size/jdwlabs/usersrole/latest) -![Docker Pulls](https://img.shields.io/docker/pulls/jdwlabs/usersrole) - -## What it is - -A Spring Boot (Java 21) REST service backing the platform's user and role management. -It exposes secured endpoints consumed by the `usersui` and `rolesui` micro-frontends -and persists to the `jdwlabs/authdb` PostgreSQL database. Built with Jib on an -`eclipse-temurin:21` base. - -## Quick start - -```bash -docker run -p 8080:8080 \ - -e SPRING_DATASOURCE_URL=jdbc:postgresql://authdb:5432/jdw \ - -e SPRING_DATASOURCE_USERNAME=jdw \ - -e SPRING_DATASOURCE_PASSWORD=change-me \ - jdwlabs/usersrole:latest -``` - -## Exposed ports - -| Port | Purpose | -| ------ | -------------------------------- | -| `8080` | HTTP API (incl. actuator health) | - -## Environment variables - -Standard Spring Boot externalized config. Common overrides: - -| Name | Purpose | -| ---------------------------- | ------------------------------ | -| `SPRING_DATASOURCE_URL` | JDBC URL for the auth database | -| `SPRING_DATASOURCE_USERNAME` | database user | -| `SPRING_DATASOURCE_PASSWORD` | database password | - -## Tags - -| Tag | Meaning | -| ----------- | ------------------------------ | -| `latest` | most recent release | -| `{version}` | specific semver (e.g. `1.2.3`) | - -## Source & license - -Source: -License: PolyForm Noncommercial 1.0.0 diff --git a/apps/backend/usersrole/VERSION b/apps/backend/usersrole/VERSION deleted file mode 100644 index 3eefcb9dd..000000000 --- a/apps/backend/usersrole/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.0.0 diff --git a/apps/backend/usersrole/build.gradle.kts b/apps/backend/usersrole/build.gradle.kts index ec9f8a322..27c52131e 100644 --- a/apps/backend/usersrole/build.gradle.kts +++ b/apps/backend/usersrole/build.gradle.kts @@ -1,5 +1,4 @@ import com.google.cloud.tools.jib.api.buildplan.ImageFormat -import java.time.Instant import org.springframework.boot.gradle.tasks.bundling.BootBuildImage plugins { @@ -12,7 +11,7 @@ plugins { } group = "com.jdw" -version = file("VERSION").readText().trim() +version = "0.10.15" java { sourceCompatibility = JavaVersion.VERSION_21 @@ -78,17 +77,6 @@ tasks.named("bootBuildImage") { } } -// Resolved at configuration time for the OCI image.revision label. A missing git -// context (e.g. a source-tarball build) is non-fatal — fall back rather than fail. -val gitRevision: String = runCatching { - ProcessBuilder("git", "rev-parse", "--short", "HEAD") - .redirectErrorStream(true) - .start() - .inputStream.bufferedReader().readText().trim() -}.getOrNull()?.takeIf { it.isNotEmpty() } ?: "unknown" - -val imageCreated: String = Instant.now().toString() - jib { to { image = "docker.io/jdwlabs/${project.name}:${version}" @@ -108,21 +96,5 @@ jib { container { format = ImageFormat.OCI ports = listOf("8080") - // Mirrors scripts/build-image.sh so the Jib-built image carries the same - // org.opencontainers.image.* set as the six buildx images. - labels.set( - mapOf( - "org.opencontainers.image.title" to "usersrole", - "org.opencontainers.image.description" to "Users & roles Spring Boot backend service for the jdwlabs platform", - "org.opencontainers.image.vendor" to "jdwlabs", - "org.opencontainers.image.licenses" to "PolyForm-Noncommercial-1.0.0", - "org.opencontainers.image.url" to "https://github.com/jdwlabs/apps", - "org.opencontainers.image.source" to "https://github.com/jdwlabs/apps", - "org.opencontainers.image.documentation" to "https://hub.docker.com/r/jdwlabs/usersrole", - "org.opencontainers.image.version" to version.toString(), - "org.opencontainers.image.revision" to gitRevision, - "org.opencontainers.image.created" to imageCreated, - ), - ) } } diff --git a/apps/backend/usersrole/project.json b/apps/backend/usersrole/project.json index 6a7de8fa8..84de719a9 100644 --- a/apps/backend/usersrole/project.json +++ b/apps/backend/usersrole/project.json @@ -3,11 +3,6 @@ "$schema": "../../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/backend/usersrole/src", "tags": ["type:app", "scope:usersrole", "framework:springboot"], - "release": { - "version": { - "versionActions": "./tools/release/text-file-version-actions.ts" - } - }, "targets": { "build": { "executor": "nx:run-commands", @@ -22,11 +17,22 @@ "cache": true, "command": "echo Ignored in project configuration" }, + "version": { + "executor": "@jscutlery/semver:version", + "options": { + "push": true, + "preset": "conventionalcommits", + "postTargets": ["format", "update-version", "build-image", "update-app"] + } + }, + "update-version": { + "command": "bash scripts/update-version.sh {projectRoot}/build.gradle.kts {version} {projectName}" + }, "update-app": { - "command": "bash scripts/update-app.sh charts/usersrole/Chart.yaml \"$(tr -d '[:space:]' < apps/backend/usersrole/VERSION)\" {projectName}" + "command": "bash scripts/update-app.sh charts/usersrole/Chart.yaml {version} {projectName}" }, - "update-description": { - "command": "bash scripts/update-description.sh jdwlabs/usersrole {projectRoot}/README.docker.md" + "format": { + "command": "bash scripts/format.sh" }, "serve-container": { "executor": "nx:run-commands", diff --git a/apps/database/authdb/CHANGELOG.md b/apps/database/authdb/CHANGELOG.md index 9f53d59d5..0f163b4d4 100644 --- a/apps/database/authdb/CHANGELOG.md +++ b/apps/database/authdb/CHANGELOG.md @@ -1,45 +1,7 @@ -# 1.0.0 (2026-07-10) - -### 🚀 Features - -- **apps:** enrich all images with OCI labels and Overview sync ([74feb95c](https://github.com/jdwlabs/apps/commit/74feb95c)) -- **authdb:** add multi-os-arch support ([738bd43e](https://github.com/jdwlabs/apps/commit/738bd43e)) -- **authdb:** add multi-os-arch support ([08e52ad4](https://github.com/jdwlabs/apps/commit/08e52ad4)) -- **authdb:** update database init data ([9a3cb544](https://github.com/jdwlabs/apps/commit/9a3cb544)) -- **authdb:** add unique constraint for role name and role data update ([fe7cc034](https://github.com/jdwlabs/apps/commit/fe7cc034)) -- **authdb:** add birthdate to profiles table ([764a674d](https://github.com/jdwlabs/apps/commit/764a674d)) -- **authdb:** update database init data ([7579430e](https://github.com/jdwlabs/apps/commit/7579430e)) -- **authdb:** add unique constraint for role name and role data update ([a6a79d8a](https://github.com/jdwlabs/apps/commit/a6a79d8a)) -- **authdb:** add birthdate to profiles table ([24c10a7b](https://github.com/jdwlabs/apps/commit/24c10a7b)) -- **authdb:** add authdb app ([86af1830](https://github.com/jdwlabs/apps/commit/86af1830)) - -### 🩹 Fixes - -- **authdb:** use jdwlabs.com domain for system seed user ([c53214ca](https://github.com/jdwlabs/apps/commit/c53214ca)) -- fix Dockerfile pathing for ci ([cb0b522a](https://github.com/jdwlabs/apps/commit/cb0b522a)) - -### ❤️ Thank You - -- Claude Opus 4.8 -- Jacob David Willmsen @jdwillmsen -- Jake Willmsen @jdwillmsen - # Changelog This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). -## [0.5.0](https://github.com/jdwlabs/apps/compare/authdb-0.4.5...authdb-0.5.0) (2026-07-01) - -### Features - -- **apps:** enrich all images with OCI labels and Overview sync ([bfd1325](https://github.com/jdwlabs/apps/commit/bfd1325172d58ceb042b9eb2994f1105d1cdce53)) - -## [0.4.5](https://github.com/jdwlabs/apps/compare/authdb-0.4.4...authdb-0.4.5) (2026-06-18) - -### Bug Fixes - -- **authdb:** use jdwlabs.com domain for system seed user ([7cd837f](https://github.com/jdwlabs/apps/commit/7cd837f7124fa4a65ff2dc47d9f0d91f5c9ecc39)) - ## [0.4.4](https://github.com/jdwlabs/apps/compare/authdb-0.4.3...authdb-0.4.4) (2026-05-28) ## [0.4.3](https://github.com/jdwlabs/apps/compare/authdb-0.4.2...authdb-0.4.3) (2026-05-26) diff --git a/apps/database/authdb/Dockerfile b/apps/database/authdb/Dockerfile index b830ed0f6..ddaaf6ad1 100644 --- a/apps/database/authdb/Dockerfile +++ b/apps/database/authdb/Dockerfile @@ -1,4 +1,7 @@ FROM postgres:16.4 +LABEL maintainer="Jake Willmsen" +LABEL description="PostgreSQL image with custom initialization scripts." +LABEL license="MIT" ENV POSTGRES_USER=default_user ENV POSTGRES_PASSWORD=default_password diff --git a/apps/database/authdb/README.docker.md b/apps/database/authdb/README.docker.md deleted file mode 100644 index e5cdd4356..000000000 --- a/apps/database/authdb/README.docker.md +++ /dev/null @@ -1,53 +0,0 @@ -# jdwlabs/authdb - -PostgreSQL image with **jdwlabs auth schema** initialization scripts. - -![Docker Image Version](https://img.shields.io/docker/v/jdwlabs/authdb?sort=semver) -![Docker Image Size](https://img.shields.io/docker/image-size/jdwlabs/authdb/latest) -![Docker Pulls](https://img.shields.io/docker/pulls/jdwlabs/authdb) - -## What it is - -A `postgres:16.4` image that bundles the jdwlabs auth database bootstrap. The SQL in -`/docker-entrypoint-initdb.d/` runs on first startup against an empty data directory, -creating the schema and seed data the `jdwlabs/usersrole` backend expects. - -## Quick start - -```bash -docker run -p 5432:5432 \ - -e POSTGRES_USER=jdw \ - -e POSTGRES_PASSWORD=change-me \ - -e POSTGRES_DB=jdw \ - jdwlabs/authdb:latest -``` - -The init scripts only run when the data volume is empty (standard Postgres behavior). - -## Exposed ports - -| Port | Purpose | -| ------ | ---------- | -| `5432` | PostgreSQL | - -## Environment variables - -| Name | Default | Purpose | -| ------------------- | ------------------ | ------------------------ | -| `POSTGRES_USER` | `default_user` | superuser name | -| `POSTGRES_PASSWORD` | `default_password` | superuser password | -| `POSTGRES_DB` | `jdw` | database created on init | - -Override the defaults in any non-local environment. - -## Tags - -| Tag | Meaning | -| ----------- | ------------------------------ | -| `latest` | most recent release | -| `{version}` | specific semver (e.g. `1.2.3`) | - -## Source & license - -Source: -License: PolyForm Noncommercial 1.0.0 diff --git a/apps/database/authdb/VERSION b/apps/database/authdb/VERSION deleted file mode 100644 index 3eefcb9dd..000000000 --- a/apps/database/authdb/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.0.0 diff --git a/apps/database/authdb/project.json b/apps/database/authdb/project.json index 081f57eea..fba32ae29 100644 --- a/apps/database/authdb/project.json +++ b/apps/database/authdb/project.json @@ -5,11 +5,6 @@ "prefix": "jdw", "sourceRoot": "apps/database/authdb/src", "tags": ["type:app", "scope:authdb", "framework:database"], - "release": { - "version": { - "versionActions": "./tools/release/text-file-version-actions.ts" - } - }, "targets": { "lint": { "cache": true, @@ -19,12 +14,20 @@ "cache": true, "command": "echo no build - check out 'npx nx run authdb:build-image'" }, + "version": { + "executor": "@jscutlery/semver:version", + "options": { + "push": true, + "preset": "conventionalcommits", + "postTargets": ["format", "build-image"] + } + }, "build-image": { "executor": "nx:run-commands", "options": { "commands": [ { - "command": "bash scripts/build-image.sh authdb \"$(tr -d '[:space:]' < apps/database/authdb/VERSION)\" {projectRoot}/Dockerfile \"PostgreSQL image with jdwlabs auth schema initialization scripts\" --platform linux/amd64,linux/arm64 --push", + "command": "docker buildx build --platform linux/amd64,linux/arm64 -f {projectRoot}/Dockerfile -t jdwlabs/authdb:latest -t jdwlabs/authdb:{version} .", "forwardAllArgs": false } ], @@ -36,15 +39,15 @@ "options": { "commands": [ { - "command": "bash scripts/build-image.sh authdb local {projectRoot}/Dockerfile \"PostgreSQL image with jdwlabs auth schema initialization scripts\" --load", + "command": "docker buildx build -f {projectRoot}/Dockerfile -t jdwlabs/authdb:latest .", "forwardAllArgs": false } ], "parallel": false } }, - "update-description": { - "command": "bash scripts/update-description.sh jdwlabs/authdb {projectRoot}/README.docker.md" + "format": { + "command": "bash scripts/format.sh" }, "serve": { "command": "docker run --rm -p 5432:5432 jdwlabs/authdb:latest" diff --git a/apps/database/authdb/src/01_data.sql b/apps/database/authdb/src/01_data.sql index de4ce787e..90d64e11f 100644 --- a/apps/database/authdb/src/01_data.sql +++ b/apps/database/authdb/src/01_data.sql @@ -8,13 +8,9 @@ INSERT INTO auth.roles (role_name, role_description, created_by_user_id, created VALUES ('USER', 'Standard user role with basic access.', 1, CURRENT_TIMESTAMP, 1, CURRENT_TIMESTAMP); INSERT INTO auth.users (email_address, password, created_by_user_id, created_time, modified_by_user_id, modified_time) -VALUES ('system@jdwlabs.com', '$2a$10$v5e3IStWiGNj1tmB8WWoguoVQHFThHyMlqaOJP1vrNyrrcZfwDRBa', 1, CURRENT_TIMESTAMP, 1, CURRENT_TIMESTAMP); +VALUES ('system@jdw.com', '$2a$10$v5e3IStWiGNj1tmB8WWoguoVQHFThHyMlqaOJP1vrNyrrcZfwDRBa', 1, CURRENT_TIMESTAMP, 1, CURRENT_TIMESTAMP); --- Resolve ids by natural key (email, role_name) so the grant survives whatever --- values the identity sequences assign instead of assuming 1/1,2,3. INSERT INTO auth.users_roles (user_id, role_id, created_by_user_id, created_time) -SELECT u.user_id, r.role_id, u.user_id, CURRENT_TIMESTAMP -FROM auth.users u -CROSS JOIN auth.roles r -WHERE u.email_address = 'system@jdwlabs.com' - AND r.role_name IN ('ADMIN', 'MANAGER', 'USER'); +VALUES (1, 1, 1, CURRENT_TIMESTAMP), -- Admin role + (1, 2, 1, CURRENT_TIMESTAMP), -- Manager role + (1, 3, 1, CURRENT_TIMESTAMP); -- User role diff --git a/apps/e2e/platform-e2e/playwright.config.ts b/apps/e2e/platform-e2e/playwright.config.ts index b44138f9f..28547c0e9 100644 --- a/apps/e2e/platform-e2e/playwright.config.ts +++ b/apps/e2e/platform-e2e/playwright.config.ts @@ -4,51 +4,42 @@ import { workspaceRoot } from '@nx/devkit'; const baseURL = process.env['BASE_URL'] ?? 'http://localhost:4200'; -// An explicit BASE_URL means the platform is already running somewhere real -// (e.g. staging via the deployments repo pipeline) — spinning up local static -// servers would be wasted work and could shadow the environment under test. -const useDeployedEnvironment = !!process.env['BASE_URL']; - export default defineConfig({ ...nxE2EPreset(__filename, { testDir: './src' }), use: { baseURL, trace: 'on-first-retry', }, - ...(useDeployedEnvironment - ? {} - : { - webServer: [ - { - command: 'pnpm exec nx run container:serve-static', - url: 'http://localhost:4200', - reuseExistingServer: !process.env['CI'], - cwd: workspaceRoot, - timeout: 180_000, - }, - { - command: 'pnpm exec nx run authui:serve-static', - url: 'http://localhost:4201', - reuseExistingServer: !process.env['CI'], - cwd: workspaceRoot, - timeout: 180_000, - }, - { - command: 'pnpm exec nx run usersui:serve-static', - url: 'http://localhost:4202', - reuseExistingServer: !process.env['CI'], - cwd: workspaceRoot, - timeout: 180_000, - }, - { - command: 'pnpm exec nx run rolesui:serve-static', - url: 'http://localhost:4203', - reuseExistingServer: !process.env['CI'], - cwd: workspaceRoot, - timeout: 180_000, - }, - ], - }), + webServer: [ + { + command: 'pnpm exec nx run container:serve-static', + url: 'http://localhost:4200', + reuseExistingServer: !process.env['CI'], + cwd: workspaceRoot, + timeout: 180_000, + }, + { + command: 'pnpm exec nx run authui:serve-static', + url: 'http://localhost:4201', + reuseExistingServer: !process.env['CI'], + cwd: workspaceRoot, + timeout: 180_000, + }, + { + command: 'pnpm exec nx run usersui:serve-static', + url: 'http://localhost:4202', + reuseExistingServer: !process.env['CI'], + cwd: workspaceRoot, + timeout: 180_000, + }, + { + command: 'pnpm exec nx run rolesui:serve-static', + url: 'http://localhost:4203', + reuseExistingServer: !process.env['CI'], + cwd: workspaceRoot, + timeout: 180_000, + }, + ], projects: [ { name: 'chromium', diff --git a/apps/e2e/platform-e2e/src/support/mock-service-discovery.ts b/apps/e2e/platform-e2e/src/support/mock-service-discovery.ts index 271aa7cba..87f051c79 100644 --- a/apps/e2e/platform-e2e/src/support/mock-service-discovery.ts +++ b/apps/e2e/platform-e2e/src/support/mock-service-discovery.ts @@ -31,12 +31,6 @@ const MOCK_ROUTES = [ ]; export async function mockServiceDiscovery(page: Page): Promise { - // BASE_URL targets a deployed environment whose real service-discovery - // backend serves /api/micro-frontends — mocking it there would hide the - // exact integration these post-deploy runs exist to verify. - if (process.env['BASE_URL']) { - return; - } await page.route('**/api/micro-frontends', async (route) => { await route.fulfill({ status: 200, diff --git a/apps/frontend/authui/CHANGELOG.md b/apps/frontend/authui/CHANGELOG.md index 26424c62d..89045c4b8 100644 --- a/apps/frontend/authui/CHANGELOG.md +++ b/apps/frontend/authui/CHANGELOG.md @@ -1,493 +1,7 @@ -# 2.0.0 (2026-07-10) - -### 🚀 Features - -- **apps:** enrich all images with OCI labels and Overview sync ([74feb95c](https://github.com/jdwlabs/apps/commit/74feb95c)) - -### 🩹 Fixes - -- **build:** point config targets at scripts/ not tools/ ([75122982](https://github.com/jdwlabs/apps/commit/75122982)) -- **frontend:** resolve broken theme @use after role-based move (JDWLABS-20) ([2ed97b5a](https://github.com/jdwlabs/apps/commit/2ed97b5a)) -- **structure:** fix stale paths missed during role-based restructure ([a012da32](https://github.com/jdwlabs/apps/commit/a012da32)) - -### 🧱 Updated Dependencies - -- Updated frontend-shared-util to 1.0.0 - -### ❤️ Thank You - -- Claude Opus 4.8 -- Claude Sonnet 4.6 -- Jake Willmsen @jdwillmsen - # Changelog This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). -## [1.4.229](https://github.com/jdwlabs/apps/compare/authui-1.4.228...authui-1.4.229) (2026-07-04) - -## [1.4.228](https://github.com/jdwlabs/apps/compare/authui-1.4.227...authui-1.4.228) (2026-07-04) - -## [1.4.227](https://github.com/jdwlabs/apps/compare/authui-1.4.226...authui-1.4.227) (2026-07-04) - -## [1.4.226](https://github.com/jdwlabs/apps/compare/authui-1.4.225...authui-1.4.226) (2026-07-04) - -## [1.4.225](https://github.com/jdwlabs/apps/compare/authui-1.4.224...authui-1.4.225) (2026-07-04) - -## [1.4.224](https://github.com/jdwlabs/apps/compare/authui-1.4.223...authui-1.4.224) (2026-07-04) - -## [1.4.223](https://github.com/jdwlabs/apps/compare/authui-1.4.222...authui-1.4.223) (2026-07-04) - -## [1.4.222](https://github.com/jdwlabs/apps/compare/authui-1.4.221...authui-1.4.222) (2026-07-04) - -## [1.4.221](https://github.com/jdwlabs/apps/compare/authui-1.4.220...authui-1.4.221) (2026-07-04) - -## [1.4.220](https://github.com/jdwlabs/apps/compare/authui-1.4.219...authui-1.4.220) (2026-07-04) - -## [1.4.219](https://github.com/jdwlabs/apps/compare/authui-1.4.218...authui-1.4.219) (2026-07-04) - -## [1.4.218](https://github.com/jdwlabs/apps/compare/authui-1.4.217...authui-1.4.218) (2026-07-04) - -## [1.4.217](https://github.com/jdwlabs/apps/compare/authui-1.4.216...authui-1.4.217) (2026-07-04) - -## [1.4.216](https://github.com/jdwlabs/apps/compare/authui-1.4.215...authui-1.4.216) (2026-07-04) - -## [1.4.215](https://github.com/jdwlabs/apps/compare/authui-1.4.214...authui-1.4.215) (2026-07-04) - -## [1.4.214](https://github.com/jdwlabs/apps/compare/authui-1.4.213...authui-1.4.214) (2026-07-04) - -## [1.4.213](https://github.com/jdwlabs/apps/compare/authui-1.4.212...authui-1.4.213) (2026-07-04) - -## [1.4.212](https://github.com/jdwlabs/apps/compare/authui-1.4.211...authui-1.4.212) (2026-07-04) - -## [1.4.211](https://github.com/jdwlabs/apps/compare/authui-1.4.210...authui-1.4.211) (2026-07-04) - -## [1.4.210](https://github.com/jdwlabs/apps/compare/authui-1.4.209...authui-1.4.210) (2026-07-04) - -## [1.4.209](https://github.com/jdwlabs/apps/compare/authui-1.4.208...authui-1.4.209) (2026-07-04) - -## [1.4.208](https://github.com/jdwlabs/apps/compare/authui-1.4.207...authui-1.4.208) (2026-07-04) - -## [1.4.207](https://github.com/jdwlabs/apps/compare/authui-1.4.206...authui-1.4.207) (2026-07-04) - -## [1.4.206](https://github.com/jdwlabs/apps/compare/authui-1.4.205...authui-1.4.206) (2026-07-04) - -## [1.4.205](https://github.com/jdwlabs/apps/compare/authui-1.4.204...authui-1.4.205) (2026-07-04) - -## [1.4.204](https://github.com/jdwlabs/apps/compare/authui-1.4.203...authui-1.4.204) (2026-07-04) - -## [1.4.203](https://github.com/jdwlabs/apps/compare/authui-1.4.202...authui-1.4.203) (2026-07-04) - -## [1.4.202](https://github.com/jdwlabs/apps/compare/authui-1.4.201...authui-1.4.202) (2026-07-04) - -## [1.4.201](https://github.com/jdwlabs/apps/compare/authui-1.4.200...authui-1.4.201) (2026-07-04) - -## [1.4.200](https://github.com/jdwlabs/apps/compare/authui-1.4.199...authui-1.4.200) (2026-07-04) - -## [1.4.199](https://github.com/jdwlabs/apps/compare/authui-1.4.198...authui-1.4.199) (2026-07-04) - -## [1.4.198](https://github.com/jdwlabs/apps/compare/authui-1.4.197...authui-1.4.198) (2026-07-04) - -## [1.4.197](https://github.com/jdwlabs/apps/compare/authui-1.4.196...authui-1.4.197) (2026-07-04) - -## [1.4.196](https://github.com/jdwlabs/apps/compare/authui-1.4.195...authui-1.4.196) (2026-07-04) - -## [1.4.195](https://github.com/jdwlabs/apps/compare/authui-1.4.194...authui-1.4.195) (2026-07-04) - -## [1.4.194](https://github.com/jdwlabs/apps/compare/authui-1.4.193...authui-1.4.194) (2026-07-04) - -## [1.4.193](https://github.com/jdwlabs/apps/compare/authui-1.4.192...authui-1.4.193) (2026-07-04) - -## [1.4.192](https://github.com/jdwlabs/apps/compare/authui-1.4.191...authui-1.4.192) (2026-07-04) - -## [1.4.191](https://github.com/jdwlabs/apps/compare/authui-1.4.190...authui-1.4.191) (2026-07-04) - -## [1.4.190](https://github.com/jdwlabs/apps/compare/authui-1.4.189...authui-1.4.190) (2026-07-04) - -## [1.4.189](https://github.com/jdwlabs/apps/compare/authui-1.4.188...authui-1.4.189) (2026-07-04) - -## [1.4.188](https://github.com/jdwlabs/apps/compare/authui-1.4.187...authui-1.4.188) (2026-07-04) - -## [1.4.187](https://github.com/jdwlabs/apps/compare/authui-1.4.186...authui-1.4.187) (2026-07-04) - -## [1.4.186](https://github.com/jdwlabs/apps/compare/authui-1.4.185...authui-1.4.186) (2026-07-04) - -## [1.4.185](https://github.com/jdwlabs/apps/compare/authui-1.4.184...authui-1.4.185) (2026-07-04) - -## [1.4.184](https://github.com/jdwlabs/apps/compare/authui-1.4.183...authui-1.4.184) (2026-07-04) - -## [1.4.183](https://github.com/jdwlabs/apps/compare/authui-1.4.182...authui-1.4.183) (2026-07-04) - -## [1.4.182](https://github.com/jdwlabs/apps/compare/authui-1.4.181...authui-1.4.182) (2026-07-04) - -## [1.4.181](https://github.com/jdwlabs/apps/compare/authui-1.4.180...authui-1.4.181) (2026-07-04) - -## [1.4.180](https://github.com/jdwlabs/apps/compare/authui-1.4.179...authui-1.4.180) (2026-07-04) - -## [1.4.179](https://github.com/jdwlabs/apps/compare/authui-1.4.178...authui-1.4.179) (2026-07-04) - -## [1.4.178](https://github.com/jdwlabs/apps/compare/authui-1.4.177...authui-1.4.178) (2026-07-04) - -## [1.4.177](https://github.com/jdwlabs/apps/compare/authui-1.4.176...authui-1.4.177) (2026-07-03) - -## [1.4.176](https://github.com/jdwlabs/apps/compare/authui-1.4.175...authui-1.4.176) (2026-07-03) - -## [1.4.175](https://github.com/jdwlabs/apps/compare/authui-1.4.174...authui-1.4.175) (2026-07-03) - -## [1.4.174](https://github.com/jdwlabs/apps/compare/authui-1.4.173...authui-1.4.174) (2026-07-03) - -## [1.4.173](https://github.com/jdwlabs/apps/compare/authui-1.4.172...authui-1.4.173) (2026-07-03) - -## [1.4.172](https://github.com/jdwlabs/apps/compare/authui-1.4.171...authui-1.4.172) (2026-07-03) - -## [1.4.171](https://github.com/jdwlabs/apps/compare/authui-1.4.170...authui-1.4.171) (2026-07-03) - -## [1.4.170](https://github.com/jdwlabs/apps/compare/authui-1.4.169...authui-1.4.170) (2026-07-03) - -## [1.4.169](https://github.com/jdwlabs/apps/compare/authui-1.4.168...authui-1.4.169) (2026-07-03) - -## [1.4.168](https://github.com/jdwlabs/apps/compare/authui-1.4.167...authui-1.4.168) (2026-07-03) - -## [1.4.167](https://github.com/jdwlabs/apps/compare/authui-1.4.166...authui-1.4.167) (2026-07-03) - -## [1.4.166](https://github.com/jdwlabs/apps/compare/authui-1.4.165...authui-1.4.166) (2026-07-03) - -## [1.4.165](https://github.com/jdwlabs/apps/compare/authui-1.4.164...authui-1.4.165) (2026-07-03) - -## [1.4.164](https://github.com/jdwlabs/apps/compare/authui-1.4.163...authui-1.4.164) (2026-07-03) - -## [1.4.163](https://github.com/jdwlabs/apps/compare/authui-1.4.162...authui-1.4.163) (2026-07-03) - -## [1.4.162](https://github.com/jdwlabs/apps/compare/authui-1.4.161...authui-1.4.162) (2026-07-03) - -## [1.4.161](https://github.com/jdwlabs/apps/compare/authui-1.4.160...authui-1.4.161) (2026-07-03) - -## [1.4.160](https://github.com/jdwlabs/apps/compare/authui-1.4.159...authui-1.4.160) (2026-07-03) - -## [1.4.159](https://github.com/jdwlabs/apps/compare/authui-1.4.158...authui-1.4.159) (2026-07-03) - -## [1.4.158](https://github.com/jdwlabs/apps/compare/authui-1.4.157...authui-1.4.158) (2026-07-03) - -## [1.4.157](https://github.com/jdwlabs/apps/compare/authui-1.4.156...authui-1.4.157) (2026-07-03) - -## [1.4.156](https://github.com/jdwlabs/apps/compare/authui-1.4.155...authui-1.4.156) (2026-07-03) - -## [1.4.155](https://github.com/jdwlabs/apps/compare/authui-1.4.154...authui-1.4.155) (2026-07-03) - -## [1.4.154](https://github.com/jdwlabs/apps/compare/authui-1.4.153...authui-1.4.154) (2026-07-03) - -## [1.4.153](https://github.com/jdwlabs/apps/compare/authui-1.4.152...authui-1.4.153) (2026-07-03) - -## [1.4.152](https://github.com/jdwlabs/apps/compare/authui-1.4.151...authui-1.4.152) (2026-07-03) - -## [1.4.151](https://github.com/jdwlabs/apps/compare/authui-1.4.150...authui-1.4.151) (2026-07-03) - -## [1.4.150](https://github.com/jdwlabs/apps/compare/authui-1.4.149...authui-1.4.150) (2026-07-03) - -## [1.4.149](https://github.com/jdwlabs/apps/compare/authui-1.4.148...authui-1.4.149) (2026-07-03) - -## [1.4.148](https://github.com/jdwlabs/apps/compare/authui-1.4.147...authui-1.4.148) (2026-07-03) - -## [1.4.147](https://github.com/jdwlabs/apps/compare/authui-1.4.146...authui-1.4.147) (2026-07-03) - -## [1.4.146](https://github.com/jdwlabs/apps/compare/authui-1.4.145...authui-1.4.146) (2026-07-03) - -## [1.4.145](https://github.com/jdwlabs/apps/compare/authui-1.4.144...authui-1.4.145) (2026-07-03) - -## [1.4.144](https://github.com/jdwlabs/apps/compare/authui-1.4.143...authui-1.4.144) (2026-07-03) - -## [1.4.143](https://github.com/jdwlabs/apps/compare/authui-1.4.142...authui-1.4.143) (2026-07-03) - -## [1.4.142](https://github.com/jdwlabs/apps/compare/authui-1.4.141...authui-1.4.142) (2026-07-03) - -## [1.4.141](https://github.com/jdwlabs/apps/compare/authui-1.4.140...authui-1.4.141) (2026-07-03) - -## [1.4.140](https://github.com/jdwlabs/apps/compare/authui-1.4.139...authui-1.4.140) (2026-07-03) - -## [1.4.139](https://github.com/jdwlabs/apps/compare/authui-1.4.138...authui-1.4.139) (2026-07-03) - -## [1.4.138](https://github.com/jdwlabs/apps/compare/authui-1.4.137...authui-1.4.138) (2026-07-03) - -## [1.4.137](https://github.com/jdwlabs/apps/compare/authui-1.4.136...authui-1.4.137) (2026-07-03) - -## [1.4.136](https://github.com/jdwlabs/apps/compare/authui-1.4.135...authui-1.4.136) (2026-07-03) - -## [1.4.135](https://github.com/jdwlabs/apps/compare/authui-1.4.134...authui-1.4.135) (2026-07-03) - -## [1.4.134](https://github.com/jdwlabs/apps/compare/authui-1.4.133...authui-1.4.134) (2026-07-03) - -## [1.4.133](https://github.com/jdwlabs/apps/compare/authui-1.4.132...authui-1.4.133) (2026-07-03) - -## [1.4.132](https://github.com/jdwlabs/apps/compare/authui-1.4.131...authui-1.4.132) (2026-07-03) - -## [1.4.131](https://github.com/jdwlabs/apps/compare/authui-1.4.130...authui-1.4.131) (2026-07-03) - -## [1.4.130](https://github.com/jdwlabs/apps/compare/authui-1.4.129...authui-1.4.130) (2026-07-03) - -## [1.4.129](https://github.com/jdwlabs/apps/compare/authui-1.4.128...authui-1.4.129) (2026-07-03) - -## [1.4.128](https://github.com/jdwlabs/apps/compare/authui-1.4.127...authui-1.4.128) (2026-07-03) - -## [1.4.127](https://github.com/jdwlabs/apps/compare/authui-1.4.126...authui-1.4.127) (2026-07-03) - -## [1.4.126](https://github.com/jdwlabs/apps/compare/authui-1.4.125...authui-1.4.126) (2026-07-03) - -## [1.4.125](https://github.com/jdwlabs/apps/compare/authui-1.4.124...authui-1.4.125) (2026-07-03) - -## [1.4.124](https://github.com/jdwlabs/apps/compare/authui-1.4.123...authui-1.4.124) (2026-07-03) - -## [1.4.123](https://github.com/jdwlabs/apps/compare/authui-1.4.122...authui-1.4.123) (2026-07-03) - -## [1.4.122](https://github.com/jdwlabs/apps/compare/authui-1.4.121...authui-1.4.122) (2026-07-03) - -## [1.4.121](https://github.com/jdwlabs/apps/compare/authui-1.4.120...authui-1.4.121) (2026-07-03) - -## [1.4.120](https://github.com/jdwlabs/apps/compare/authui-1.4.119...authui-1.4.120) (2026-07-03) - -## [1.4.119](https://github.com/jdwlabs/apps/compare/authui-1.4.118...authui-1.4.119) (2026-07-03) - -## [1.4.118](https://github.com/jdwlabs/apps/compare/authui-1.4.117...authui-1.4.118) (2026-07-03) - -## [1.4.117](https://github.com/jdwlabs/apps/compare/authui-1.4.116...authui-1.4.117) (2026-07-03) - -## [1.4.116](https://github.com/jdwlabs/apps/compare/authui-1.4.115...authui-1.4.116) (2026-07-03) - -## [1.4.115](https://github.com/jdwlabs/apps/compare/authui-1.4.114...authui-1.4.115) (2026-07-03) - -## [1.4.114](https://github.com/jdwlabs/apps/compare/authui-1.4.113...authui-1.4.114) (2026-07-03) - -## [1.4.113](https://github.com/jdwlabs/apps/compare/authui-1.4.112...authui-1.4.113) (2026-07-03) - -## [1.4.112](https://github.com/jdwlabs/apps/compare/authui-1.4.111...authui-1.4.112) (2026-07-03) - -## [1.4.111](https://github.com/jdwlabs/apps/compare/authui-1.4.110...authui-1.4.111) (2026-07-03) - -## [1.4.110](https://github.com/jdwlabs/apps/compare/authui-1.4.109...authui-1.4.110) (2026-07-03) - -## [1.4.109](https://github.com/jdwlabs/apps/compare/authui-1.4.108...authui-1.4.109) (2026-07-03) - -## [1.4.108](https://github.com/jdwlabs/apps/compare/authui-1.4.107...authui-1.4.108) (2026-07-03) - -## [1.4.107](https://github.com/jdwlabs/apps/compare/authui-1.4.106...authui-1.4.107) (2026-07-03) - -## [1.4.106](https://github.com/jdwlabs/apps/compare/authui-1.4.105...authui-1.4.106) (2026-07-03) - -## [1.4.105](https://github.com/jdwlabs/apps/compare/authui-1.4.104...authui-1.4.105) (2026-07-03) - -## [1.4.104](https://github.com/jdwlabs/apps/compare/authui-1.4.103...authui-1.4.104) (2026-07-03) - -## [1.4.103](https://github.com/jdwlabs/apps/compare/authui-1.4.102...authui-1.4.103) (2026-07-03) - -## [1.4.102](https://github.com/jdwlabs/apps/compare/authui-1.4.101...authui-1.4.102) (2026-07-03) - -## [1.4.101](https://github.com/jdwlabs/apps/compare/authui-1.4.100...authui-1.4.101) (2026-07-03) - -## [1.4.100](https://github.com/jdwlabs/apps/compare/authui-1.4.99...authui-1.4.100) (2026-07-03) - -## [1.4.99](https://github.com/jdwlabs/apps/compare/authui-1.4.98...authui-1.4.99) (2026-07-03) - -## [1.4.98](https://github.com/jdwlabs/apps/compare/authui-1.4.97...authui-1.4.98) (2026-07-03) - -## [1.4.97](https://github.com/jdwlabs/apps/compare/authui-1.4.96...authui-1.4.97) (2026-07-03) - -## [1.4.96](https://github.com/jdwlabs/apps/compare/authui-1.4.95...authui-1.4.96) (2026-07-03) - -## [1.4.95](https://github.com/jdwlabs/apps/compare/authui-1.4.94...authui-1.4.95) (2026-07-03) - -## [1.4.94](https://github.com/jdwlabs/apps/compare/authui-1.4.93...authui-1.4.94) (2026-07-03) - -## [1.4.93](https://github.com/jdwlabs/apps/compare/authui-1.4.92...authui-1.4.93) (2026-07-03) - -## [1.4.92](https://github.com/jdwlabs/apps/compare/authui-1.4.91...authui-1.4.92) (2026-07-03) - -## [1.4.91](https://github.com/jdwlabs/apps/compare/authui-1.4.90...authui-1.4.91) (2026-07-03) - -## [1.4.90](https://github.com/jdwlabs/apps/compare/authui-1.4.89...authui-1.4.90) (2026-07-03) - -## [1.4.89](https://github.com/jdwlabs/apps/compare/authui-1.4.88...authui-1.4.89) (2026-07-03) - -## [1.4.88](https://github.com/jdwlabs/apps/compare/authui-1.4.87...authui-1.4.88) (2026-07-03) - -## [1.4.87](https://github.com/jdwlabs/apps/compare/authui-1.4.86...authui-1.4.87) (2026-07-03) - -## [1.4.86](https://github.com/jdwlabs/apps/compare/authui-1.4.85...authui-1.4.86) (2026-07-03) - -## [1.4.85](https://github.com/jdwlabs/apps/compare/authui-1.4.84...authui-1.4.85) (2026-07-03) - -## [1.4.84](https://github.com/jdwlabs/apps/compare/authui-1.4.83...authui-1.4.84) (2026-07-03) - -## [1.4.83](https://github.com/jdwlabs/apps/compare/authui-1.4.82...authui-1.4.83) (2026-07-03) - -## [1.4.82](https://github.com/jdwlabs/apps/compare/authui-1.4.81...authui-1.4.82) (2026-07-03) - -## [1.4.81](https://github.com/jdwlabs/apps/compare/authui-1.4.80...authui-1.4.81) (2026-07-03) - -## [1.4.80](https://github.com/jdwlabs/apps/compare/authui-1.4.79...authui-1.4.80) (2026-07-03) - -## [1.4.79](https://github.com/jdwlabs/apps/compare/authui-1.4.78...authui-1.4.79) (2026-07-03) - -## [1.4.78](https://github.com/jdwlabs/apps/compare/authui-1.4.77...authui-1.4.78) (2026-07-03) - -## [1.4.77](https://github.com/jdwlabs/apps/compare/authui-1.4.76...authui-1.4.77) (2026-07-03) - -## [1.4.76](https://github.com/jdwlabs/apps/compare/authui-1.4.75...authui-1.4.76) (2026-07-03) - -## [1.4.75](https://github.com/jdwlabs/apps/compare/authui-1.4.74...authui-1.4.75) (2026-07-03) - -## [1.4.74](https://github.com/jdwlabs/apps/compare/authui-1.4.73...authui-1.4.74) (2026-07-03) - -## [1.4.73](https://github.com/jdwlabs/apps/compare/authui-1.4.72...authui-1.4.73) (2026-07-03) - -## [1.4.72](https://github.com/jdwlabs/apps/compare/authui-1.4.71...authui-1.4.72) (2026-07-03) - -## [1.4.71](https://github.com/jdwlabs/apps/compare/authui-1.4.70...authui-1.4.71) (2026-07-03) - -## [1.4.70](https://github.com/jdwlabs/apps/compare/authui-1.4.69...authui-1.4.70) (2026-07-03) - -## [1.4.69](https://github.com/jdwlabs/apps/compare/authui-1.4.68...authui-1.4.69) (2026-07-03) - -## [1.4.68](https://github.com/jdwlabs/apps/compare/authui-1.4.67...authui-1.4.68) (2026-07-03) - -## [1.4.67](https://github.com/jdwlabs/apps/compare/authui-1.4.66...authui-1.4.67) (2026-07-03) - -## [1.4.66](https://github.com/jdwlabs/apps/compare/authui-1.4.65...authui-1.4.66) (2026-07-03) - -## [1.4.65](https://github.com/jdwlabs/apps/compare/authui-1.4.64...authui-1.4.65) (2026-07-03) - -## [1.4.64](https://github.com/jdwlabs/apps/compare/authui-1.4.63...authui-1.4.64) (2026-07-03) - -## [1.4.63](https://github.com/jdwlabs/apps/compare/authui-1.4.62...authui-1.4.63) (2026-07-03) - -## [1.4.62](https://github.com/jdwlabs/apps/compare/authui-1.4.61...authui-1.4.62) (2026-07-03) - -## [1.4.61](https://github.com/jdwlabs/apps/compare/authui-1.4.60...authui-1.4.61) (2026-07-03) - -## [1.4.60](https://github.com/jdwlabs/apps/compare/authui-1.4.59...authui-1.4.60) (2026-07-03) - -## [1.4.59](https://github.com/jdwlabs/apps/compare/authui-1.4.58...authui-1.4.59) (2026-07-03) - -## [1.4.58](https://github.com/jdwlabs/apps/compare/authui-1.4.57...authui-1.4.58) (2026-07-03) - -## [1.4.57](https://github.com/jdwlabs/apps/compare/authui-1.4.56...authui-1.4.57) (2026-07-03) - -## [1.4.56](https://github.com/jdwlabs/apps/compare/authui-1.4.55...authui-1.4.56) (2026-07-03) - -## [1.4.55](https://github.com/jdwlabs/apps/compare/authui-1.4.54...authui-1.4.55) (2026-07-03) - -## [1.4.54](https://github.com/jdwlabs/apps/compare/authui-1.4.53...authui-1.4.54) (2026-07-03) - -## [1.4.53](https://github.com/jdwlabs/apps/compare/authui-1.4.52...authui-1.4.53) (2026-07-03) - -## [1.4.52](https://github.com/jdwlabs/apps/compare/authui-1.4.51...authui-1.4.52) (2026-07-03) - -## [1.4.51](https://github.com/jdwlabs/apps/compare/authui-1.4.50...authui-1.4.51) (2026-07-03) - -## [1.4.50](https://github.com/jdwlabs/apps/compare/authui-1.4.49...authui-1.4.50) (2026-07-03) - -## [1.4.49](https://github.com/jdwlabs/apps/compare/authui-1.4.48...authui-1.4.49) (2026-07-03) - -## [1.4.48](https://github.com/jdwlabs/apps/compare/authui-1.4.47...authui-1.4.48) (2026-07-03) - -## [1.4.47](https://github.com/jdwlabs/apps/compare/authui-1.4.46...authui-1.4.47) (2026-07-03) - -## [1.4.46](https://github.com/jdwlabs/apps/compare/authui-1.4.45...authui-1.4.46) (2026-07-03) - -## [1.4.45](https://github.com/jdwlabs/apps/compare/authui-1.4.44...authui-1.4.45) (2026-07-03) - -## [1.4.44](https://github.com/jdwlabs/apps/compare/authui-1.4.43...authui-1.4.44) (2026-07-03) - -## [1.4.43](https://github.com/jdwlabs/apps/compare/authui-1.4.42...authui-1.4.43) (2026-07-03) - -## [1.4.42](https://github.com/jdwlabs/apps/compare/authui-1.4.41...authui-1.4.42) (2026-07-03) - -## [1.4.41](https://github.com/jdwlabs/apps/compare/authui-1.4.40...authui-1.4.41) (2026-07-03) - -## [1.4.40](https://github.com/jdwlabs/apps/compare/authui-1.4.39...authui-1.4.40) (2026-07-03) - -## [1.4.39](https://github.com/jdwlabs/apps/compare/authui-1.4.38...authui-1.4.39) (2026-07-03) - -## [1.4.38](https://github.com/jdwlabs/apps/compare/authui-1.4.37...authui-1.4.38) (2026-07-03) - -## [1.4.37](https://github.com/jdwlabs/apps/compare/authui-1.4.36...authui-1.4.37) (2026-07-03) - -## [1.4.36](https://github.com/jdwlabs/apps/compare/authui-1.4.35...authui-1.4.36) (2026-07-03) - -## [1.4.35](https://github.com/jdwlabs/apps/compare/authui-1.4.34...authui-1.4.35) (2026-07-03) - -## [1.4.34](https://github.com/jdwlabs/apps/compare/authui-1.4.33...authui-1.4.34) (2026-07-03) - -## [1.4.33](https://github.com/jdwlabs/apps/compare/authui-1.4.32...authui-1.4.33) (2026-07-03) - -## [1.4.32](https://github.com/jdwlabs/apps/compare/authui-1.4.31...authui-1.4.32) (2026-07-03) - -## [1.4.31](https://github.com/jdwlabs/apps/compare/authui-1.4.30...authui-1.4.31) (2026-07-03) - -## [1.4.30](https://github.com/jdwlabs/apps/compare/authui-1.4.29...authui-1.4.30) (2026-07-03) - -## [1.4.29](https://github.com/jdwlabs/apps/compare/authui-1.4.28...authui-1.4.29) (2026-07-03) - -## [1.4.28](https://github.com/jdwlabs/apps/compare/authui-1.4.27...authui-1.4.28) (2026-07-03) - -## [1.4.27](https://github.com/jdwlabs/apps/compare/authui-1.4.26...authui-1.4.27) (2026-07-03) - -## [1.4.26](https://github.com/jdwlabs/apps/compare/authui-1.4.25...authui-1.4.26) (2026-07-03) - -## [1.4.25](https://github.com/jdwlabs/apps/compare/authui-1.4.24...authui-1.4.25) (2026-07-03) - -## [1.4.24](https://github.com/jdwlabs/apps/compare/authui-1.4.23...authui-1.4.24) (2026-07-01) - -## [1.4.23](https://github.com/jdwlabs/apps/compare/authui-1.4.22...authui-1.4.23) (2026-07-01) - -## [1.4.22](https://github.com/jdwlabs/apps/compare/authui-1.4.21...authui-1.4.22) (2026-07-01) - -## [1.4.21](https://github.com/jdwlabs/apps/compare/authui-1.4.20...authui-1.4.21) (2026-07-01) - -## [1.4.20](https://github.com/jdwlabs/apps/compare/authui-1.4.19...authui-1.4.20) (2026-07-01) - -## [1.4.19](https://github.com/jdwlabs/apps/compare/authui-1.4.18...authui-1.4.19) (2026-07-01) - -## [1.4.18](https://github.com/jdwlabs/apps/compare/authui-1.4.17...authui-1.4.18) (2026-07-01) - -## [1.4.17](https://github.com/jdwlabs/apps/compare/authui-1.4.16...authui-1.4.17) (2026-07-01) - -## [1.4.16](https://github.com/jdwlabs/apps/compare/authui-1.4.15...authui-1.4.16) (2026-07-01) - -## [1.4.15](https://github.com/jdwlabs/apps/compare/authui-1.4.14...authui-1.4.15) (2026-07-01) - -## [1.4.14](https://github.com/jdwlabs/apps/compare/authui-1.4.13...authui-1.4.14) (2026-07-01) - -## [1.4.13](https://github.com/jdwlabs/apps/compare/authui-1.4.12...authui-1.4.13) (2026-07-01) - -## [1.4.12](https://github.com/jdwlabs/apps/compare/authui-1.4.11...authui-1.4.12) (2026-07-01) - -## [1.4.11](https://github.com/jdwlabs/apps/compare/authui-1.4.10...authui-1.4.11) (2026-07-01) - -## [1.4.10](https://github.com/jdwlabs/apps/compare/authui-1.4.9...authui-1.4.10) (2026-07-01) - -## [1.4.9](https://github.com/jdwlabs/apps/compare/authui-1.4.8...authui-1.4.9) (2026-07-01) - -## [1.4.8](https://github.com/jdwlabs/apps/compare/authui-1.4.7...authui-1.4.8) (2026-07-01) - -## [1.4.7](https://github.com/jdwlabs/apps/compare/authui-1.4.6...authui-1.4.7) (2026-07-01) - -## [1.4.6](https://github.com/jdwlabs/apps/compare/authui-1.4.5...authui-1.4.6) (2026-07-01) - -## [1.4.5](https://github.com/jdwlabs/apps/compare/authui-1.4.4...authui-1.4.5) (2026-07-01) - -## [1.4.4](https://github.com/jdwlabs/apps/compare/authui-1.4.3...authui-1.4.4) (2026-07-01) - -## [1.4.3](https://github.com/jdwlabs/apps/compare/authui-1.4.2...authui-1.4.3) (2026-07-01) - -## [1.4.2](https://github.com/jdwlabs/apps/compare/authui-1.4.1...authui-1.4.2) (2026-07-01) - -## [1.4.1](https://github.com/jdwlabs/apps/compare/authui-1.4.0...authui-1.4.1) (2026-07-01) - -## [1.4.0](https://github.com/jdwlabs/apps/compare/authui-1.3.2...authui-1.4.0) (2026-07-01) - -### Features - -- **apps:** enrich all images with OCI labels and Overview sync ([bfd1325](https://github.com/jdwlabs/apps/commit/bfd1325172d58ceb042b9eb2994f1105d1cdce53)) - ## [1.3.2](https://github.com/jdwlabs/apps/compare/authui-1.3.1...authui-1.3.2) (2026-06-08) ### Bug Fixes diff --git a/apps/frontend/authui/README.docker.md b/apps/frontend/authui/README.docker.md deleted file mode 100644 index 8c9fc8f01..000000000 --- a/apps/frontend/authui/README.docker.md +++ /dev/null @@ -1,45 +0,0 @@ -# jdwlabs/authui - -Auth **micro-frontend** (sign in / sign up) for the jdwlabs platform. - -![Docker Image Version](https://img.shields.io/docker/v/jdwlabs/authui?sort=semver) -![Docker Image Size](https://img.shields.io/docker/image-size/jdwlabs/authui/latest) -![Docker Pulls](https://img.shields.io/docker/pulls/jdwlabs/authui) - -## What it is - -A module-federation remote exposing the platform's authentication UI (sign in, sign -up). It is loaded at runtime by the `jdwlabs/container` host shell and is not intended -to be browsed on its own. Served by nginx from a static build. - -## Quick start - -```bash -docker run -p 8080:80 jdwlabs/authui:latest -``` - -## Exposed ports - -| Port | Purpose | -| ---- | ------------ | -| `80` | nginx (HTTP) | - -## Environment variables - -Runtime config is injected at container start: `start-nginx.sh` runs `envsubst` over -the built JS, substituting any `$NAME` placeholder with the value of the matching -environment variable before nginx starts. Set the platform's config values (API URL) -as environment variables at deployment time; no rebuild is needed to repoint an -environment. - -## Tags - -| Tag | Meaning | -| ----------- | ------------------------------ | -| `latest` | most recent release | -| `{version}` | specific semver (e.g. `1.2.3`) | - -## Source & license - -Source: -License: PolyForm Noncommercial 1.0.0 diff --git a/apps/frontend/authui/jest.config.ts b/apps/frontend/authui/jest.config.ts new file mode 100644 index 000000000..0003c499c --- /dev/null +++ b/apps/frontend/authui/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +module.exports = { + displayName: 'authui', + preset: '../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../coverage/apps/frontend/authui', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/apps/frontend/authui/project.json b/apps/frontend/authui/project.json index faeb03f79..94337239f 100644 --- a/apps/frontend/authui/project.json +++ b/apps/frontend/authui/project.json @@ -5,12 +5,6 @@ "prefix": "app", "sourceRoot": "apps/frontend/authui/src", "tags": ["type:app", "scope:authui", "framework:angular"], - "release": { - "version": { - "versionActions": "./tools/release/text-file-version-actions.ts", - "manifestRootsToUpdate": ["{projectRoot}/public"] - } - }, "targets": { "build": { "executor": "@nx/angular:webpack-browser", @@ -136,10 +130,10 @@ "executor": "@nx/eslint:lint" }, "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "apps/frontend/authui/jest.config.ts" } }, "serve-static": { @@ -159,6 +153,17 @@ } } }, + "version": { + "executor": "@jscutlery/semver:version", + "options": { + "push": true, + "preset": "conventionalcommits", + "postTargets": ["format", "save-version", "build-image", "update-app"] + } + }, + "save-version": { + "command": "bash scripts/create-version.sh {version} {projectRoot}/public {projectName}" + }, "build-image": { "executor": "nx:run-commands", "dependsOn": ["^build", "prepare-config", "build"], @@ -173,7 +178,7 @@ "forwardAllArgs": false }, { - "command": "bash scripts/build-image.sh authui \"$(tr -d '[:space:]' < apps/frontend/authui/public/VERSION)\" {projectRoot}/Dockerfile \"Auth micro-frontend (sign in / sign up) for the jdwlabs platform\" --platform linux/amd64,linux/arm64 --push", + "command": "docker buildx build --platform linux/amd64,linux/arm64 -f {projectRoot}/Dockerfile -t jdwlabs/authui:latest -t jdwlabs/authui:{version} --push .", "forwardAllArgs": false }, { @@ -190,7 +195,7 @@ "options": { "commands": [ { - "command": "bash scripts/build-image.sh authui local {projectRoot}/Dockerfile \"Auth micro-frontend (sign in / sign up) for the jdwlabs platform\" --load", + "command": "docker buildx build -f {projectRoot}/Dockerfile -t jdwlabs/authui:latest --load .", "forwardAllArgs": false }, { @@ -202,10 +207,10 @@ } }, "update-app": { - "command": "bash scripts/update-app.sh charts/authui/Chart.yaml \"$(tr -d '[:space:]' < apps/frontend/authui/public/VERSION)\" {projectName}" + "command": "bash scripts/update-app.sh charts/authui/Chart.yaml {version} {projectName}" }, - "update-description": { - "command": "bash scripts/update-description.sh jdwlabs/authui {projectRoot}/README.docker.md" + "format": { + "command": "bash scripts/format.sh" }, "serve-container": { "executor": "nx:run-commands", diff --git a/apps/frontend/authui/public/VERSION b/apps/frontend/authui/public/VERSION index 227cea215..3a3cd8cc8 100644 --- a/apps/frontend/authui/public/VERSION +++ b/apps/frontend/authui/public/VERSION @@ -1 +1 @@ -2.0.0 +1.3.1 diff --git a/apps/frontend/authui/src/test-setup.ts b/apps/frontend/authui/src/test-setup.ts index 34e7490bc..ea414013f 100644 --- a/apps/frontend/authui/src/test-setup.ts +++ b/apps/frontend/authui/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/apps/frontend/authui/tsconfig.spec.json b/apps/frontend/authui/tsconfig.spec.json index 3e894da6f..13be072e3 100644 --- a/apps/frontend/authui/tsconfig.spec.json +++ b/apps/frontend/authui/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/apps/frontend/authui/vite.config.ts b/apps/frontend/authui/vite.config.ts deleted file mode 100644 index b271b836d..000000000 --- a/apps/frontend/authui/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../coverage/apps/frontend/authui', -); diff --git a/apps/frontend/container/CHANGELOG.md b/apps/frontend/container/CHANGELOG.md index bf1d8a2e0..a94447f77 100644 --- a/apps/frontend/container/CHANGELOG.md +++ b/apps/frontend/container/CHANGELOG.md @@ -1,493 +1,7 @@ -# 2.0.0 (2026-07-10) - -### 🚀 Features - -- **apps:** enrich all images with OCI labels and Overview sync ([74feb95c](https://github.com/jdwlabs/apps/commit/74feb95c)) - -### 🩹 Fixes - -- **build:** point config targets at scripts/ not tools/ ([75122982](https://github.com/jdwlabs/apps/commit/75122982)) -- **frontend:** resolve broken theme @use after role-based move (JDWLABS-20) ([2ed97b5a](https://github.com/jdwlabs/apps/commit/2ed97b5a)) -- **structure:** fix stale paths missed during role-based restructure ([a012da32](https://github.com/jdwlabs/apps/commit/a012da32)) - -### 🧱 Updated Dependencies - -- Updated frontend-shared-util to 1.0.0 - -### ❤️ Thank You - -- Claude Opus 4.8 -- Claude Sonnet 4.6 -- Jake Willmsen @jdwillmsen - # Changelog This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). -## [1.4.229](https://github.com/jdwlabs/apps/compare/container-1.4.228...container-1.4.229) (2026-07-04) - -## [1.4.228](https://github.com/jdwlabs/apps/compare/container-1.4.227...container-1.4.228) (2026-07-04) - -## [1.4.227](https://github.com/jdwlabs/apps/compare/container-1.4.226...container-1.4.227) (2026-07-04) - -## [1.4.226](https://github.com/jdwlabs/apps/compare/container-1.4.225...container-1.4.226) (2026-07-04) - -## [1.4.225](https://github.com/jdwlabs/apps/compare/container-1.4.224...container-1.4.225) (2026-07-04) - -## [1.4.224](https://github.com/jdwlabs/apps/compare/container-1.4.223...container-1.4.224) (2026-07-04) - -## [1.4.223](https://github.com/jdwlabs/apps/compare/container-1.4.222...container-1.4.223) (2026-07-04) - -## [1.4.222](https://github.com/jdwlabs/apps/compare/container-1.4.221...container-1.4.222) (2026-07-04) - -## [1.4.221](https://github.com/jdwlabs/apps/compare/container-1.4.220...container-1.4.221) (2026-07-04) - -## [1.4.220](https://github.com/jdwlabs/apps/compare/container-1.4.219...container-1.4.220) (2026-07-04) - -## [1.4.219](https://github.com/jdwlabs/apps/compare/container-1.4.218...container-1.4.219) (2026-07-04) - -## [1.4.218](https://github.com/jdwlabs/apps/compare/container-1.4.217...container-1.4.218) (2026-07-04) - -## [1.4.217](https://github.com/jdwlabs/apps/compare/container-1.4.216...container-1.4.217) (2026-07-04) - -## [1.4.216](https://github.com/jdwlabs/apps/compare/container-1.4.215...container-1.4.216) (2026-07-04) - -## [1.4.215](https://github.com/jdwlabs/apps/compare/container-1.4.214...container-1.4.215) (2026-07-04) - -## [1.4.214](https://github.com/jdwlabs/apps/compare/container-1.4.213...container-1.4.214) (2026-07-04) - -## [1.4.213](https://github.com/jdwlabs/apps/compare/container-1.4.212...container-1.4.213) (2026-07-04) - -## [1.4.212](https://github.com/jdwlabs/apps/compare/container-1.4.211...container-1.4.212) (2026-07-04) - -## [1.4.211](https://github.com/jdwlabs/apps/compare/container-1.4.210...container-1.4.211) (2026-07-04) - -## [1.4.210](https://github.com/jdwlabs/apps/compare/container-1.4.209...container-1.4.210) (2026-07-04) - -## [1.4.209](https://github.com/jdwlabs/apps/compare/container-1.4.208...container-1.4.209) (2026-07-04) - -## [1.4.208](https://github.com/jdwlabs/apps/compare/container-1.4.207...container-1.4.208) (2026-07-04) - -## [1.4.207](https://github.com/jdwlabs/apps/compare/container-1.4.206...container-1.4.207) (2026-07-04) - -## [1.4.206](https://github.com/jdwlabs/apps/compare/container-1.4.205...container-1.4.206) (2026-07-04) - -## [1.4.205](https://github.com/jdwlabs/apps/compare/container-1.4.204...container-1.4.205) (2026-07-04) - -## [1.4.204](https://github.com/jdwlabs/apps/compare/container-1.4.203...container-1.4.204) (2026-07-04) - -## [1.4.203](https://github.com/jdwlabs/apps/compare/container-1.4.202...container-1.4.203) (2026-07-04) - -## [1.4.202](https://github.com/jdwlabs/apps/compare/container-1.4.201...container-1.4.202) (2026-07-04) - -## [1.4.201](https://github.com/jdwlabs/apps/compare/container-1.4.200...container-1.4.201) (2026-07-04) - -## [1.4.200](https://github.com/jdwlabs/apps/compare/container-1.4.199...container-1.4.200) (2026-07-04) - -## [1.4.199](https://github.com/jdwlabs/apps/compare/container-1.4.198...container-1.4.199) (2026-07-04) - -## [1.4.198](https://github.com/jdwlabs/apps/compare/container-1.4.197...container-1.4.198) (2026-07-04) - -## [1.4.197](https://github.com/jdwlabs/apps/compare/container-1.4.196...container-1.4.197) (2026-07-04) - -## [1.4.196](https://github.com/jdwlabs/apps/compare/container-1.4.195...container-1.4.196) (2026-07-04) - -## [1.4.195](https://github.com/jdwlabs/apps/compare/container-1.4.194...container-1.4.195) (2026-07-04) - -## [1.4.194](https://github.com/jdwlabs/apps/compare/container-1.4.193...container-1.4.194) (2026-07-04) - -## [1.4.193](https://github.com/jdwlabs/apps/compare/container-1.4.192...container-1.4.193) (2026-07-04) - -## [1.4.192](https://github.com/jdwlabs/apps/compare/container-1.4.191...container-1.4.192) (2026-07-04) - -## [1.4.191](https://github.com/jdwlabs/apps/compare/container-1.4.190...container-1.4.191) (2026-07-04) - -## [1.4.190](https://github.com/jdwlabs/apps/compare/container-1.4.189...container-1.4.190) (2026-07-04) - -## [1.4.189](https://github.com/jdwlabs/apps/compare/container-1.4.188...container-1.4.189) (2026-07-04) - -## [1.4.188](https://github.com/jdwlabs/apps/compare/container-1.4.187...container-1.4.188) (2026-07-04) - -## [1.4.187](https://github.com/jdwlabs/apps/compare/container-1.4.186...container-1.4.187) (2026-07-04) - -## [1.4.186](https://github.com/jdwlabs/apps/compare/container-1.4.185...container-1.4.186) (2026-07-04) - -## [1.4.185](https://github.com/jdwlabs/apps/compare/container-1.4.184...container-1.4.185) (2026-07-04) - -## [1.4.184](https://github.com/jdwlabs/apps/compare/container-1.4.183...container-1.4.184) (2026-07-04) - -## [1.4.183](https://github.com/jdwlabs/apps/compare/container-1.4.182...container-1.4.183) (2026-07-04) - -## [1.4.182](https://github.com/jdwlabs/apps/compare/container-1.4.181...container-1.4.182) (2026-07-04) - -## [1.4.181](https://github.com/jdwlabs/apps/compare/container-1.4.180...container-1.4.181) (2026-07-04) - -## [1.4.180](https://github.com/jdwlabs/apps/compare/container-1.4.179...container-1.4.180) (2026-07-04) - -## [1.4.179](https://github.com/jdwlabs/apps/compare/container-1.4.178...container-1.4.179) (2026-07-04) - -## [1.4.178](https://github.com/jdwlabs/apps/compare/container-1.4.177...container-1.4.178) (2026-07-04) - -## [1.4.177](https://github.com/jdwlabs/apps/compare/container-1.4.176...container-1.4.177) (2026-07-03) - -## [1.4.176](https://github.com/jdwlabs/apps/compare/container-1.4.175...container-1.4.176) (2026-07-03) - -## [1.4.175](https://github.com/jdwlabs/apps/compare/container-1.4.174...container-1.4.175) (2026-07-03) - -## [1.4.174](https://github.com/jdwlabs/apps/compare/container-1.4.173...container-1.4.174) (2026-07-03) - -## [1.4.173](https://github.com/jdwlabs/apps/compare/container-1.4.172...container-1.4.173) (2026-07-03) - -## [1.4.172](https://github.com/jdwlabs/apps/compare/container-1.4.171...container-1.4.172) (2026-07-03) - -## [1.4.171](https://github.com/jdwlabs/apps/compare/container-1.4.170...container-1.4.171) (2026-07-03) - -## [1.4.170](https://github.com/jdwlabs/apps/compare/container-1.4.169...container-1.4.170) (2026-07-03) - -## [1.4.169](https://github.com/jdwlabs/apps/compare/container-1.4.168...container-1.4.169) (2026-07-03) - -## [1.4.168](https://github.com/jdwlabs/apps/compare/container-1.4.167...container-1.4.168) (2026-07-03) - -## [1.4.167](https://github.com/jdwlabs/apps/compare/container-1.4.166...container-1.4.167) (2026-07-03) - -## [1.4.166](https://github.com/jdwlabs/apps/compare/container-1.4.165...container-1.4.166) (2026-07-03) - -## [1.4.165](https://github.com/jdwlabs/apps/compare/container-1.4.164...container-1.4.165) (2026-07-03) - -## [1.4.164](https://github.com/jdwlabs/apps/compare/container-1.4.163...container-1.4.164) (2026-07-03) - -## [1.4.163](https://github.com/jdwlabs/apps/compare/container-1.4.162...container-1.4.163) (2026-07-03) - -## [1.4.162](https://github.com/jdwlabs/apps/compare/container-1.4.161...container-1.4.162) (2026-07-03) - -## [1.4.161](https://github.com/jdwlabs/apps/compare/container-1.4.160...container-1.4.161) (2026-07-03) - -## [1.4.160](https://github.com/jdwlabs/apps/compare/container-1.4.159...container-1.4.160) (2026-07-03) - -## [1.4.159](https://github.com/jdwlabs/apps/compare/container-1.4.158...container-1.4.159) (2026-07-03) - -## [1.4.158](https://github.com/jdwlabs/apps/compare/container-1.4.157...container-1.4.158) (2026-07-03) - -## [1.4.157](https://github.com/jdwlabs/apps/compare/container-1.4.156...container-1.4.157) (2026-07-03) - -## [1.4.156](https://github.com/jdwlabs/apps/compare/container-1.4.155...container-1.4.156) (2026-07-03) - -## [1.4.155](https://github.com/jdwlabs/apps/compare/container-1.4.154...container-1.4.155) (2026-07-03) - -## [1.4.154](https://github.com/jdwlabs/apps/compare/container-1.4.153...container-1.4.154) (2026-07-03) - -## [1.4.153](https://github.com/jdwlabs/apps/compare/container-1.4.152...container-1.4.153) (2026-07-03) - -## [1.4.152](https://github.com/jdwlabs/apps/compare/container-1.4.151...container-1.4.152) (2026-07-03) - -## [1.4.151](https://github.com/jdwlabs/apps/compare/container-1.4.150...container-1.4.151) (2026-07-03) - -## [1.4.150](https://github.com/jdwlabs/apps/compare/container-1.4.149...container-1.4.150) (2026-07-03) - -## [1.4.149](https://github.com/jdwlabs/apps/compare/container-1.4.148...container-1.4.149) (2026-07-03) - -## [1.4.148](https://github.com/jdwlabs/apps/compare/container-1.4.147...container-1.4.148) (2026-07-03) - -## [1.4.147](https://github.com/jdwlabs/apps/compare/container-1.4.146...container-1.4.147) (2026-07-03) - -## [1.4.146](https://github.com/jdwlabs/apps/compare/container-1.4.145...container-1.4.146) (2026-07-03) - -## [1.4.145](https://github.com/jdwlabs/apps/compare/container-1.4.144...container-1.4.145) (2026-07-03) - -## [1.4.144](https://github.com/jdwlabs/apps/compare/container-1.4.143...container-1.4.144) (2026-07-03) - -## [1.4.143](https://github.com/jdwlabs/apps/compare/container-1.4.142...container-1.4.143) (2026-07-03) - -## [1.4.142](https://github.com/jdwlabs/apps/compare/container-1.4.141...container-1.4.142) (2026-07-03) - -## [1.4.141](https://github.com/jdwlabs/apps/compare/container-1.4.140...container-1.4.141) (2026-07-03) - -## [1.4.140](https://github.com/jdwlabs/apps/compare/container-1.4.139...container-1.4.140) (2026-07-03) - -## [1.4.139](https://github.com/jdwlabs/apps/compare/container-1.4.138...container-1.4.139) (2026-07-03) - -## [1.4.138](https://github.com/jdwlabs/apps/compare/container-1.4.137...container-1.4.138) (2026-07-03) - -## [1.4.137](https://github.com/jdwlabs/apps/compare/container-1.4.136...container-1.4.137) (2026-07-03) - -## [1.4.136](https://github.com/jdwlabs/apps/compare/container-1.4.135...container-1.4.136) (2026-07-03) - -## [1.4.135](https://github.com/jdwlabs/apps/compare/container-1.4.134...container-1.4.135) (2026-07-03) - -## [1.4.134](https://github.com/jdwlabs/apps/compare/container-1.4.133...container-1.4.134) (2026-07-03) - -## [1.4.133](https://github.com/jdwlabs/apps/compare/container-1.4.132...container-1.4.133) (2026-07-03) - -## [1.4.132](https://github.com/jdwlabs/apps/compare/container-1.4.131...container-1.4.132) (2026-07-03) - -## [1.4.131](https://github.com/jdwlabs/apps/compare/container-1.4.130...container-1.4.131) (2026-07-03) - -## [1.4.130](https://github.com/jdwlabs/apps/compare/container-1.4.129...container-1.4.130) (2026-07-03) - -## [1.4.129](https://github.com/jdwlabs/apps/compare/container-1.4.128...container-1.4.129) (2026-07-03) - -## [1.4.128](https://github.com/jdwlabs/apps/compare/container-1.4.127...container-1.4.128) (2026-07-03) - -## [1.4.127](https://github.com/jdwlabs/apps/compare/container-1.4.126...container-1.4.127) (2026-07-03) - -## [1.4.126](https://github.com/jdwlabs/apps/compare/container-1.4.125...container-1.4.126) (2026-07-03) - -## [1.4.125](https://github.com/jdwlabs/apps/compare/container-1.4.124...container-1.4.125) (2026-07-03) - -## [1.4.124](https://github.com/jdwlabs/apps/compare/container-1.4.123...container-1.4.124) (2026-07-03) - -## [1.4.123](https://github.com/jdwlabs/apps/compare/container-1.4.122...container-1.4.123) (2026-07-03) - -## [1.4.122](https://github.com/jdwlabs/apps/compare/container-1.4.121...container-1.4.122) (2026-07-03) - -## [1.4.121](https://github.com/jdwlabs/apps/compare/container-1.4.120...container-1.4.121) (2026-07-03) - -## [1.4.120](https://github.com/jdwlabs/apps/compare/container-1.4.119...container-1.4.120) (2026-07-03) - -## [1.4.119](https://github.com/jdwlabs/apps/compare/container-1.4.118...container-1.4.119) (2026-07-03) - -## [1.4.118](https://github.com/jdwlabs/apps/compare/container-1.4.117...container-1.4.118) (2026-07-03) - -## [1.4.117](https://github.com/jdwlabs/apps/compare/container-1.4.116...container-1.4.117) (2026-07-03) - -## [1.4.116](https://github.com/jdwlabs/apps/compare/container-1.4.115...container-1.4.116) (2026-07-03) - -## [1.4.115](https://github.com/jdwlabs/apps/compare/container-1.4.114...container-1.4.115) (2026-07-03) - -## [1.4.114](https://github.com/jdwlabs/apps/compare/container-1.4.113...container-1.4.114) (2026-07-03) - -## [1.4.113](https://github.com/jdwlabs/apps/compare/container-1.4.112...container-1.4.113) (2026-07-03) - -## [1.4.112](https://github.com/jdwlabs/apps/compare/container-1.4.111...container-1.4.112) (2026-07-03) - -## [1.4.111](https://github.com/jdwlabs/apps/compare/container-1.4.110...container-1.4.111) (2026-07-03) - -## [1.4.110](https://github.com/jdwlabs/apps/compare/container-1.4.109...container-1.4.110) (2026-07-03) - -## [1.4.109](https://github.com/jdwlabs/apps/compare/container-1.4.108...container-1.4.109) (2026-07-03) - -## [1.4.108](https://github.com/jdwlabs/apps/compare/container-1.4.107...container-1.4.108) (2026-07-03) - -## [1.4.107](https://github.com/jdwlabs/apps/compare/container-1.4.106...container-1.4.107) (2026-07-03) - -## [1.4.106](https://github.com/jdwlabs/apps/compare/container-1.4.105...container-1.4.106) (2026-07-03) - -## [1.4.105](https://github.com/jdwlabs/apps/compare/container-1.4.104...container-1.4.105) (2026-07-03) - -## [1.4.104](https://github.com/jdwlabs/apps/compare/container-1.4.103...container-1.4.104) (2026-07-03) - -## [1.4.103](https://github.com/jdwlabs/apps/compare/container-1.4.102...container-1.4.103) (2026-07-03) - -## [1.4.102](https://github.com/jdwlabs/apps/compare/container-1.4.101...container-1.4.102) (2026-07-03) - -## [1.4.101](https://github.com/jdwlabs/apps/compare/container-1.4.100...container-1.4.101) (2026-07-03) - -## [1.4.100](https://github.com/jdwlabs/apps/compare/container-1.4.99...container-1.4.100) (2026-07-03) - -## [1.4.99](https://github.com/jdwlabs/apps/compare/container-1.4.98...container-1.4.99) (2026-07-03) - -## [1.4.98](https://github.com/jdwlabs/apps/compare/container-1.4.97...container-1.4.98) (2026-07-03) - -## [1.4.97](https://github.com/jdwlabs/apps/compare/container-1.4.96...container-1.4.97) (2026-07-03) - -## [1.4.96](https://github.com/jdwlabs/apps/compare/container-1.4.95...container-1.4.96) (2026-07-03) - -## [1.4.95](https://github.com/jdwlabs/apps/compare/container-1.4.94...container-1.4.95) (2026-07-03) - -## [1.4.94](https://github.com/jdwlabs/apps/compare/container-1.4.93...container-1.4.94) (2026-07-03) - -## [1.4.93](https://github.com/jdwlabs/apps/compare/container-1.4.92...container-1.4.93) (2026-07-03) - -## [1.4.92](https://github.com/jdwlabs/apps/compare/container-1.4.91...container-1.4.92) (2026-07-03) - -## [1.4.91](https://github.com/jdwlabs/apps/compare/container-1.4.90...container-1.4.91) (2026-07-03) - -## [1.4.90](https://github.com/jdwlabs/apps/compare/container-1.4.89...container-1.4.90) (2026-07-03) - -## [1.4.89](https://github.com/jdwlabs/apps/compare/container-1.4.88...container-1.4.89) (2026-07-03) - -## [1.4.88](https://github.com/jdwlabs/apps/compare/container-1.4.87...container-1.4.88) (2026-07-03) - -## [1.4.87](https://github.com/jdwlabs/apps/compare/container-1.4.86...container-1.4.87) (2026-07-03) - -## [1.4.86](https://github.com/jdwlabs/apps/compare/container-1.4.85...container-1.4.86) (2026-07-03) - -## [1.4.85](https://github.com/jdwlabs/apps/compare/container-1.4.84...container-1.4.85) (2026-07-03) - -## [1.4.84](https://github.com/jdwlabs/apps/compare/container-1.4.83...container-1.4.84) (2026-07-03) - -## [1.4.83](https://github.com/jdwlabs/apps/compare/container-1.4.82...container-1.4.83) (2026-07-03) - -## [1.4.82](https://github.com/jdwlabs/apps/compare/container-1.4.81...container-1.4.82) (2026-07-03) - -## [1.4.81](https://github.com/jdwlabs/apps/compare/container-1.4.80...container-1.4.81) (2026-07-03) - -## [1.4.80](https://github.com/jdwlabs/apps/compare/container-1.4.79...container-1.4.80) (2026-07-03) - -## [1.4.79](https://github.com/jdwlabs/apps/compare/container-1.4.78...container-1.4.79) (2026-07-03) - -## [1.4.78](https://github.com/jdwlabs/apps/compare/container-1.4.77...container-1.4.78) (2026-07-03) - -## [1.4.77](https://github.com/jdwlabs/apps/compare/container-1.4.76...container-1.4.77) (2026-07-03) - -## [1.4.76](https://github.com/jdwlabs/apps/compare/container-1.4.75...container-1.4.76) (2026-07-03) - -## [1.4.75](https://github.com/jdwlabs/apps/compare/container-1.4.74...container-1.4.75) (2026-07-03) - -## [1.4.74](https://github.com/jdwlabs/apps/compare/container-1.4.73...container-1.4.74) (2026-07-03) - -## [1.4.73](https://github.com/jdwlabs/apps/compare/container-1.4.72...container-1.4.73) (2026-07-03) - -## [1.4.72](https://github.com/jdwlabs/apps/compare/container-1.4.71...container-1.4.72) (2026-07-03) - -## [1.4.71](https://github.com/jdwlabs/apps/compare/container-1.4.70...container-1.4.71) (2026-07-03) - -## [1.4.70](https://github.com/jdwlabs/apps/compare/container-1.4.69...container-1.4.70) (2026-07-03) - -## [1.4.69](https://github.com/jdwlabs/apps/compare/container-1.4.68...container-1.4.69) (2026-07-03) - -## [1.4.68](https://github.com/jdwlabs/apps/compare/container-1.4.67...container-1.4.68) (2026-07-03) - -## [1.4.67](https://github.com/jdwlabs/apps/compare/container-1.4.66...container-1.4.67) (2026-07-03) - -## [1.4.66](https://github.com/jdwlabs/apps/compare/container-1.4.65...container-1.4.66) (2026-07-03) - -## [1.4.65](https://github.com/jdwlabs/apps/compare/container-1.4.64...container-1.4.65) (2026-07-03) - -## [1.4.64](https://github.com/jdwlabs/apps/compare/container-1.4.63...container-1.4.64) (2026-07-03) - -## [1.4.63](https://github.com/jdwlabs/apps/compare/container-1.4.62...container-1.4.63) (2026-07-03) - -## [1.4.62](https://github.com/jdwlabs/apps/compare/container-1.4.61...container-1.4.62) (2026-07-03) - -## [1.4.61](https://github.com/jdwlabs/apps/compare/container-1.4.60...container-1.4.61) (2026-07-03) - -## [1.4.60](https://github.com/jdwlabs/apps/compare/container-1.4.59...container-1.4.60) (2026-07-03) - -## [1.4.59](https://github.com/jdwlabs/apps/compare/container-1.4.58...container-1.4.59) (2026-07-03) - -## [1.4.58](https://github.com/jdwlabs/apps/compare/container-1.4.57...container-1.4.58) (2026-07-03) - -## [1.4.57](https://github.com/jdwlabs/apps/compare/container-1.4.56...container-1.4.57) (2026-07-03) - -## [1.4.56](https://github.com/jdwlabs/apps/compare/container-1.4.55...container-1.4.56) (2026-07-03) - -## [1.4.55](https://github.com/jdwlabs/apps/compare/container-1.4.54...container-1.4.55) (2026-07-03) - -## [1.4.54](https://github.com/jdwlabs/apps/compare/container-1.4.53...container-1.4.54) (2026-07-03) - -## [1.4.53](https://github.com/jdwlabs/apps/compare/container-1.4.52...container-1.4.53) (2026-07-03) - -## [1.4.52](https://github.com/jdwlabs/apps/compare/container-1.4.51...container-1.4.52) (2026-07-03) - -## [1.4.51](https://github.com/jdwlabs/apps/compare/container-1.4.50...container-1.4.51) (2026-07-03) - -## [1.4.50](https://github.com/jdwlabs/apps/compare/container-1.4.49...container-1.4.50) (2026-07-03) - -## [1.4.49](https://github.com/jdwlabs/apps/compare/container-1.4.48...container-1.4.49) (2026-07-03) - -## [1.4.48](https://github.com/jdwlabs/apps/compare/container-1.4.47...container-1.4.48) (2026-07-03) - -## [1.4.47](https://github.com/jdwlabs/apps/compare/container-1.4.46...container-1.4.47) (2026-07-03) - -## [1.4.46](https://github.com/jdwlabs/apps/compare/container-1.4.45...container-1.4.46) (2026-07-03) - -## [1.4.45](https://github.com/jdwlabs/apps/compare/container-1.4.44...container-1.4.45) (2026-07-03) - -## [1.4.44](https://github.com/jdwlabs/apps/compare/container-1.4.43...container-1.4.44) (2026-07-03) - -## [1.4.43](https://github.com/jdwlabs/apps/compare/container-1.4.42...container-1.4.43) (2026-07-03) - -## [1.4.42](https://github.com/jdwlabs/apps/compare/container-1.4.41...container-1.4.42) (2026-07-03) - -## [1.4.41](https://github.com/jdwlabs/apps/compare/container-1.4.40...container-1.4.41) (2026-07-03) - -## [1.4.40](https://github.com/jdwlabs/apps/compare/container-1.4.39...container-1.4.40) (2026-07-03) - -## [1.4.39](https://github.com/jdwlabs/apps/compare/container-1.4.38...container-1.4.39) (2026-07-03) - -## [1.4.38](https://github.com/jdwlabs/apps/compare/container-1.4.37...container-1.4.38) (2026-07-03) - -## [1.4.37](https://github.com/jdwlabs/apps/compare/container-1.4.36...container-1.4.37) (2026-07-03) - -## [1.4.36](https://github.com/jdwlabs/apps/compare/container-1.4.35...container-1.4.36) (2026-07-03) - -## [1.4.35](https://github.com/jdwlabs/apps/compare/container-1.4.34...container-1.4.35) (2026-07-03) - -## [1.4.34](https://github.com/jdwlabs/apps/compare/container-1.4.33...container-1.4.34) (2026-07-03) - -## [1.4.33](https://github.com/jdwlabs/apps/compare/container-1.4.32...container-1.4.33) (2026-07-03) - -## [1.4.32](https://github.com/jdwlabs/apps/compare/container-1.4.31...container-1.4.32) (2026-07-03) - -## [1.4.31](https://github.com/jdwlabs/apps/compare/container-1.4.30...container-1.4.31) (2026-07-03) - -## [1.4.30](https://github.com/jdwlabs/apps/compare/container-1.4.29...container-1.4.30) (2026-07-03) - -## [1.4.29](https://github.com/jdwlabs/apps/compare/container-1.4.28...container-1.4.29) (2026-07-03) - -## [1.4.28](https://github.com/jdwlabs/apps/compare/container-1.4.27...container-1.4.28) (2026-07-03) - -## [1.4.27](https://github.com/jdwlabs/apps/compare/container-1.4.26...container-1.4.27) (2026-07-03) - -## [1.4.26](https://github.com/jdwlabs/apps/compare/container-1.4.25...container-1.4.26) (2026-07-03) - -## [1.4.25](https://github.com/jdwlabs/apps/compare/container-1.4.24...container-1.4.25) (2026-07-03) - -## [1.4.24](https://github.com/jdwlabs/apps/compare/container-1.4.23...container-1.4.24) (2026-07-01) - -## [1.4.23](https://github.com/jdwlabs/apps/compare/container-1.4.22...container-1.4.23) (2026-07-01) - -## [1.4.22](https://github.com/jdwlabs/apps/compare/container-1.4.21...container-1.4.22) (2026-07-01) - -## [1.4.21](https://github.com/jdwlabs/apps/compare/container-1.4.20...container-1.4.21) (2026-07-01) - -## [1.4.20](https://github.com/jdwlabs/apps/compare/container-1.4.19...container-1.4.20) (2026-07-01) - -## [1.4.19](https://github.com/jdwlabs/apps/compare/container-1.4.18...container-1.4.19) (2026-07-01) - -## [1.4.18](https://github.com/jdwlabs/apps/compare/container-1.4.17...container-1.4.18) (2026-07-01) - -## [1.4.17](https://github.com/jdwlabs/apps/compare/container-1.4.16...container-1.4.17) (2026-07-01) - -## [1.4.16](https://github.com/jdwlabs/apps/compare/container-1.4.15...container-1.4.16) (2026-07-01) - -## [1.4.15](https://github.com/jdwlabs/apps/compare/container-1.4.14...container-1.4.15) (2026-07-01) - -## [1.4.14](https://github.com/jdwlabs/apps/compare/container-1.4.13...container-1.4.14) (2026-07-01) - -## [1.4.13](https://github.com/jdwlabs/apps/compare/container-1.4.12...container-1.4.13) (2026-07-01) - -## [1.4.12](https://github.com/jdwlabs/apps/compare/container-1.4.11...container-1.4.12) (2026-07-01) - -## [1.4.11](https://github.com/jdwlabs/apps/compare/container-1.4.10...container-1.4.11) (2026-07-01) - -## [1.4.10](https://github.com/jdwlabs/apps/compare/container-1.4.9...container-1.4.10) (2026-07-01) - -## [1.4.9](https://github.com/jdwlabs/apps/compare/container-1.4.8...container-1.4.9) (2026-07-01) - -## [1.4.8](https://github.com/jdwlabs/apps/compare/container-1.4.7...container-1.4.8) (2026-07-01) - -## [1.4.7](https://github.com/jdwlabs/apps/compare/container-1.4.6...container-1.4.7) (2026-07-01) - -## [1.4.6](https://github.com/jdwlabs/apps/compare/container-1.4.5...container-1.4.6) (2026-07-01) - -## [1.4.5](https://github.com/jdwlabs/apps/compare/container-1.4.4...container-1.4.5) (2026-07-01) - -## [1.4.4](https://github.com/jdwlabs/apps/compare/container-1.4.3...container-1.4.4) (2026-07-01) - -## [1.4.3](https://github.com/jdwlabs/apps/compare/container-1.4.2...container-1.4.3) (2026-07-01) - -## [1.4.2](https://github.com/jdwlabs/apps/compare/container-1.4.1...container-1.4.2) (2026-07-01) - -## [1.4.1](https://github.com/jdwlabs/apps/compare/container-1.4.0...container-1.4.1) (2026-07-01) - -## [1.4.0](https://github.com/jdwlabs/apps/compare/container-1.3.2...container-1.4.0) (2026-07-01) - -### Features - -- **apps:** enrich all images with OCI labels and Overview sync ([bfd1325](https://github.com/jdwlabs/apps/commit/bfd1325172d58ceb042b9eb2994f1105d1cdce53)) - ## [1.3.2](https://github.com/jdwlabs/apps/compare/container-1.3.1...container-1.3.2) (2026-06-08) ### Bug Fixes diff --git a/apps/frontend/container/README.docker.md b/apps/frontend/container/README.docker.md deleted file mode 100644 index ba5e790e1..000000000 --- a/apps/frontend/container/README.docker.md +++ /dev/null @@ -1,48 +0,0 @@ -# jdwlabs/container - -Angular module-federation **host shell** for the jdwlabs platform. - -![Docker Image Version](https://img.shields.io/docker/v/jdwlabs/container?sort=semver) -![Docker Image Size](https://img.shields.io/docker/image-size/jdwlabs/container/latest) -![Docker Pulls](https://img.shields.io/docker/pulls/jdwlabs/container) - -## What it is - -The container is the shell application that hosts the platform's micro-frontends -(`authui`, `usersui`, `rolesui`). It loads the remotes at runtime via module -federation, using the discovery data served by `jdwlabs/servicediscovery`. Served by -nginx from a static build. - -## Quick start - -```bash -docker run -p 8080:80 jdwlabs/container:latest -``` - -Then open . - -## Exposed ports - -| Port | Purpose | -| ---- | ------------ | -| `80` | nginx (HTTP) | - -## Environment variables - -Runtime config is injected at container start: `start-nginx.sh` runs `envsubst` over -the built JS, substituting any `$NAME` placeholder with the value of the matching -environment variable before nginx starts. Set the platform's config values (API and -remote URLs) as environment variables at `docker run` / deployment time; no rebuild is -needed to repoint an environment. - -## Tags - -| Tag | Meaning | -| ----------- | ------------------------------ | -| `latest` | most recent release | -| `{version}` | specific semver (e.g. `1.2.3`) | - -## Source & license - -Source: -License: PolyForm Noncommercial 1.0.0 diff --git a/apps/frontend/container/jest.config.ts b/apps/frontend/container/jest.config.ts new file mode 100644 index 000000000..3198d40f8 --- /dev/null +++ b/apps/frontend/container/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +module.exports = { + displayName: 'container', + preset: '../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../coverage/apps/frontend/container', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/apps/frontend/container/project.json b/apps/frontend/container/project.json index 94cf2fa44..762c048a6 100644 --- a/apps/frontend/container/project.json +++ b/apps/frontend/container/project.json @@ -5,12 +5,6 @@ "prefix": "jdw", "sourceRoot": "apps/frontend/container/src", "tags": ["type:app", "scope:container", "framework:angular"], - "release": { - "version": { - "versionActions": "./tools/release/text-file-version-actions.ts", - "manifestRootsToUpdate": ["{projectRoot}/public"] - } - }, "targets": { "build": { "executor": "@nx/angular:webpack-browser", @@ -133,10 +127,10 @@ "executor": "@nx/eslint:lint" }, "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "apps/frontend/container/jest.config.ts" } }, "serve-static": { @@ -146,6 +140,17 @@ "port": 4200 } }, + "version": { + "executor": "@jscutlery/semver:version", + "options": { + "push": true, + "preset": "conventionalcommits", + "postTargets": ["format", "save-version", "build-image", "update-app"] + } + }, + "save-version": { + "command": "bash scripts/create-version.sh {version} {projectRoot}/public {projectName}" + }, "build-image": { "executor": "nx:run-commands", "dependsOn": ["^build", "prepare-config", "build"], @@ -160,7 +165,7 @@ "forwardAllArgs": false }, { - "command": "bash scripts/build-image.sh container \"$(tr -d '[:space:]' < apps/frontend/container/public/VERSION)\" {projectRoot}/Dockerfile \"Angular module-federation host shell for the jdwlabs platform\" --platform linux/amd64,linux/arm64 --push", + "command": "docker buildx build --platform linux/amd64,linux/arm64 -f {projectRoot}/Dockerfile -t jdwlabs/container:latest -t jdwlabs/container:{version} --push .", "forwardAllArgs": false }, { @@ -177,7 +182,7 @@ "options": { "commands": [ { - "command": "bash scripts/build-image.sh container local {projectRoot}/Dockerfile \"Angular module-federation host shell for the jdwlabs platform\" --load", + "command": "docker buildx build -f {projectRoot}/Dockerfile -t jdwlabs/container:latest --load .", "forwardAllArgs": false }, { @@ -189,10 +194,10 @@ } }, "update-app": { - "command": "bash scripts/update-app.sh charts/container/Chart.yaml \"$(tr -d '[:space:]' < apps/frontend/container/public/VERSION)\" {projectName}" + "command": "bash scripts/update-app.sh charts/container/Chart.yaml {version} {projectName}" }, - "update-description": { - "command": "bash scripts/update-description.sh jdwlabs/container {projectRoot}/README.docker.md" + "format": { + "command": "bash scripts/format.sh" }, "serve-container": { "executor": "nx:run-commands", diff --git a/apps/frontend/container/public/VERSION b/apps/frontend/container/public/VERSION index 227cea215..3a3cd8cc8 100644 --- a/apps/frontend/container/public/VERSION +++ b/apps/frontend/container/public/VERSION @@ -1 +1 @@ -2.0.0 +1.3.1 diff --git a/apps/frontend/container/src/test-setup.ts b/apps/frontend/container/src/test-setup.ts index 34e7490bc..ea414013f 100644 --- a/apps/frontend/container/src/test-setup.ts +++ b/apps/frontend/container/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/apps/frontend/container/tsconfig.spec.json b/apps/frontend/container/tsconfig.spec.json index 3e894da6f..13be072e3 100644 --- a/apps/frontend/container/tsconfig.spec.json +++ b/apps/frontend/container/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/apps/frontend/container/vite.config.ts b/apps/frontend/container/vite.config.ts deleted file mode 100644 index f741f210e..000000000 --- a/apps/frontend/container/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../coverage/apps/frontend/container', -); diff --git a/apps/frontend/rolesui/CHANGELOG.md b/apps/frontend/rolesui/CHANGELOG.md index dc4e64652..3c950874a 100644 --- a/apps/frontend/rolesui/CHANGELOG.md +++ b/apps/frontend/rolesui/CHANGELOG.md @@ -1,465 +1,7 @@ -# 1.0.0 (2026-07-10) - -### 🚀 Features - -- **apps:** enrich all images with OCI labels and Overview sync ([74feb95c](https://github.com/jdwlabs/apps/commit/74feb95c)) - -### 🩹 Fixes - -- **build:** point config targets at scripts/ not tools/ ([75122982](https://github.com/jdwlabs/apps/commit/75122982)) -- **frontend:** resolve broken theme @use after role-based move (JDWLABS-20) ([2ed97b5a](https://github.com/jdwlabs/apps/commit/2ed97b5a)) -- **structure:** fix stale paths missed during role-based restructure ([a012da32](https://github.com/jdwlabs/apps/commit/a012da32)) - -### 🧱 Updated Dependencies - -- Updated frontend-shared-util to 1.0.0 - -### ❤️ Thank You - -- Claude Opus 4.8 -- Claude Sonnet 4.6 -- Jake Willmsen @jdwillmsen - # Changelog This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). -## [0.6.215](https://github.com/jdwlabs/apps/compare/rolesui-0.6.214...rolesui-0.6.215) (2026-07-04) - -## [0.6.214](https://github.com/jdwlabs/apps/compare/rolesui-0.6.213...rolesui-0.6.214) (2026-07-04) - -## [0.6.213](https://github.com/jdwlabs/apps/compare/rolesui-0.6.212...rolesui-0.6.213) (2026-07-04) - -## [0.6.212](https://github.com/jdwlabs/apps/compare/rolesui-0.6.211...rolesui-0.6.212) (2026-07-04) - -## [0.6.211](https://github.com/jdwlabs/apps/compare/rolesui-0.6.210...rolesui-0.6.211) (2026-07-04) - -## [0.6.210](https://github.com/jdwlabs/apps/compare/rolesui-0.6.209...rolesui-0.6.210) (2026-07-04) - -## [0.6.209](https://github.com/jdwlabs/apps/compare/rolesui-0.6.208...rolesui-0.6.209) (2026-07-04) - -## [0.6.208](https://github.com/jdwlabs/apps/compare/rolesui-0.6.207...rolesui-0.6.208) (2026-07-04) - -## [0.6.207](https://github.com/jdwlabs/apps/compare/rolesui-0.6.206...rolesui-0.6.207) (2026-07-04) - -## [0.6.206](https://github.com/jdwlabs/apps/compare/rolesui-0.6.205...rolesui-0.6.206) (2026-07-04) - -## [0.6.205](https://github.com/jdwlabs/apps/compare/rolesui-0.6.204...rolesui-0.6.205) (2026-07-04) - -## [0.6.204](https://github.com/jdwlabs/apps/compare/rolesui-0.6.203...rolesui-0.6.204) (2026-07-04) - -## [0.6.203](https://github.com/jdwlabs/apps/compare/rolesui-0.6.202...rolesui-0.6.203) (2026-07-04) - -## [0.6.202](https://github.com/jdwlabs/apps/compare/rolesui-0.6.201...rolesui-0.6.202) (2026-07-04) - -## [0.6.201](https://github.com/jdwlabs/apps/compare/rolesui-0.6.200...rolesui-0.6.201) (2026-07-04) - -## [0.6.200](https://github.com/jdwlabs/apps/compare/rolesui-0.6.199...rolesui-0.6.200) (2026-07-04) - -## [0.6.199](https://github.com/jdwlabs/apps/compare/rolesui-0.6.198...rolesui-0.6.199) (2026-07-04) - -## [0.6.198](https://github.com/jdwlabs/apps/compare/rolesui-0.6.197...rolesui-0.6.198) (2026-07-04) - -## [0.6.197](https://github.com/jdwlabs/apps/compare/rolesui-0.6.196...rolesui-0.6.197) (2026-07-04) - -## [0.6.196](https://github.com/jdwlabs/apps/compare/rolesui-0.6.195...rolesui-0.6.196) (2026-07-04) - -## [0.6.195](https://github.com/jdwlabs/apps/compare/rolesui-0.6.194...rolesui-0.6.195) (2026-07-04) - -## [0.6.194](https://github.com/jdwlabs/apps/compare/rolesui-0.6.193...rolesui-0.6.194) (2026-07-04) - -## [0.6.193](https://github.com/jdwlabs/apps/compare/rolesui-0.6.192...rolesui-0.6.193) (2026-07-04) - -## [0.6.192](https://github.com/jdwlabs/apps/compare/rolesui-0.6.191...rolesui-0.6.192) (2026-07-04) - -## [0.6.191](https://github.com/jdwlabs/apps/compare/rolesui-0.6.190...rolesui-0.6.191) (2026-07-04) - -## [0.6.190](https://github.com/jdwlabs/apps/compare/rolesui-0.6.189...rolesui-0.6.190) (2026-07-04) - -## [0.6.189](https://github.com/jdwlabs/apps/compare/rolesui-0.6.188...rolesui-0.6.189) (2026-07-04) - -## [0.6.188](https://github.com/jdwlabs/apps/compare/rolesui-0.6.187...rolesui-0.6.188) (2026-07-04) - -## [0.6.187](https://github.com/jdwlabs/apps/compare/rolesui-0.6.186...rolesui-0.6.187) (2026-07-04) - -## [0.6.186](https://github.com/jdwlabs/apps/compare/rolesui-0.6.185...rolesui-0.6.186) (2026-07-04) - -## [0.6.185](https://github.com/jdwlabs/apps/compare/rolesui-0.6.184...rolesui-0.6.185) (2026-07-04) - -## [0.6.184](https://github.com/jdwlabs/apps/compare/rolesui-0.6.183...rolesui-0.6.184) (2026-07-04) - -## [0.6.183](https://github.com/jdwlabs/apps/compare/rolesui-0.6.182...rolesui-0.6.183) (2026-07-04) - -## [0.6.182](https://github.com/jdwlabs/apps/compare/rolesui-0.6.181...rolesui-0.6.182) (2026-07-04) - -## [0.6.181](https://github.com/jdwlabs/apps/compare/rolesui-0.6.180...rolesui-0.6.181) (2026-07-04) - -## [0.6.180](https://github.com/jdwlabs/apps/compare/rolesui-0.6.179...rolesui-0.6.180) (2026-07-04) - -## [0.6.179](https://github.com/jdwlabs/apps/compare/rolesui-0.6.178...rolesui-0.6.179) (2026-07-04) - -## [0.6.178](https://github.com/jdwlabs/apps/compare/rolesui-0.6.177...rolesui-0.6.178) (2026-07-04) - -## [0.6.177](https://github.com/jdwlabs/apps/compare/rolesui-0.6.176...rolesui-0.6.177) (2026-07-03) - -## [0.6.176](https://github.com/jdwlabs/apps/compare/rolesui-0.6.175...rolesui-0.6.176) (2026-07-03) - -## [0.6.175](https://github.com/jdwlabs/apps/compare/rolesui-0.6.174...rolesui-0.6.175) (2026-07-03) - -## [0.6.174](https://github.com/jdwlabs/apps/compare/rolesui-0.6.173...rolesui-0.6.174) (2026-07-03) - -## [0.6.173](https://github.com/jdwlabs/apps/compare/rolesui-0.6.172...rolesui-0.6.173) (2026-07-03) - -## [0.6.172](https://github.com/jdwlabs/apps/compare/rolesui-0.6.171...rolesui-0.6.172) (2026-07-03) - -## [0.6.171](https://github.com/jdwlabs/apps/compare/rolesui-0.6.170...rolesui-0.6.171) (2026-07-03) - -## [0.6.170](https://github.com/jdwlabs/apps/compare/rolesui-0.6.169...rolesui-0.6.170) (2026-07-03) - -## [0.6.169](https://github.com/jdwlabs/apps/compare/rolesui-0.6.168...rolesui-0.6.169) (2026-07-03) - -## [0.6.168](https://github.com/jdwlabs/apps/compare/rolesui-0.6.167...rolesui-0.6.168) (2026-07-03) - -## [0.6.167](https://github.com/jdwlabs/apps/compare/rolesui-0.6.166...rolesui-0.6.167) (2026-07-03) - -## [0.6.166](https://github.com/jdwlabs/apps/compare/rolesui-0.6.165...rolesui-0.6.166) (2026-07-03) - -## [0.6.165](https://github.com/jdwlabs/apps/compare/rolesui-0.6.164...rolesui-0.6.165) (2026-07-03) - -## [0.6.164](https://github.com/jdwlabs/apps/compare/rolesui-0.6.163...rolesui-0.6.164) (2026-07-03) - -## [0.6.163](https://github.com/jdwlabs/apps/compare/rolesui-0.6.162...rolesui-0.6.163) (2026-07-03) - -## [0.6.162](https://github.com/jdwlabs/apps/compare/rolesui-0.6.161...rolesui-0.6.162) (2026-07-03) - -## [0.6.161](https://github.com/jdwlabs/apps/compare/rolesui-0.6.160...rolesui-0.6.161) (2026-07-03) - -## [0.6.160](https://github.com/jdwlabs/apps/compare/rolesui-0.6.159...rolesui-0.6.160) (2026-07-03) - -## [0.6.159](https://github.com/jdwlabs/apps/compare/rolesui-0.6.158...rolesui-0.6.159) (2026-07-03) - -## [0.6.158](https://github.com/jdwlabs/apps/compare/rolesui-0.6.157...rolesui-0.6.158) (2026-07-03) - -## [0.6.157](https://github.com/jdwlabs/apps/compare/rolesui-0.6.156...rolesui-0.6.157) (2026-07-03) - -## [0.6.156](https://github.com/jdwlabs/apps/compare/rolesui-0.6.155...rolesui-0.6.156) (2026-07-03) - -## [0.6.155](https://github.com/jdwlabs/apps/compare/rolesui-0.6.154...rolesui-0.6.155) (2026-07-03) - -## [0.6.154](https://github.com/jdwlabs/apps/compare/rolesui-0.6.153...rolesui-0.6.154) (2026-07-03) - -## [0.6.153](https://github.com/jdwlabs/apps/compare/rolesui-0.6.152...rolesui-0.6.153) (2026-07-03) - -## [0.6.152](https://github.com/jdwlabs/apps/compare/rolesui-0.6.151...rolesui-0.6.152) (2026-07-03) - -## [0.6.151](https://github.com/jdwlabs/apps/compare/rolesui-0.6.150...rolesui-0.6.151) (2026-07-03) - -## [0.6.150](https://github.com/jdwlabs/apps/compare/rolesui-0.6.149...rolesui-0.6.150) (2026-07-03) - -## [0.6.149](https://github.com/jdwlabs/apps/compare/rolesui-0.6.148...rolesui-0.6.149) (2026-07-03) - -## [0.6.148](https://github.com/jdwlabs/apps/compare/rolesui-0.6.147...rolesui-0.6.148) (2026-07-03) - -## [0.6.147](https://github.com/jdwlabs/apps/compare/rolesui-0.6.146...rolesui-0.6.147) (2026-07-03) - -## [0.6.146](https://github.com/jdwlabs/apps/compare/rolesui-0.6.145...rolesui-0.6.146) (2026-07-03) - -## [0.6.145](https://github.com/jdwlabs/apps/compare/rolesui-0.6.144...rolesui-0.6.145) (2026-07-03) - -## [0.6.144](https://github.com/jdwlabs/apps/compare/rolesui-0.6.143...rolesui-0.6.144) (2026-07-03) - -## [0.6.143](https://github.com/jdwlabs/apps/compare/rolesui-0.6.142...rolesui-0.6.143) (2026-07-03) - -## [0.6.142](https://github.com/jdwlabs/apps/compare/rolesui-0.6.141...rolesui-0.6.142) (2026-07-03) - -## [0.6.141](https://github.com/jdwlabs/apps/compare/rolesui-0.6.140...rolesui-0.6.141) (2026-07-03) - -## [0.6.140](https://github.com/jdwlabs/apps/compare/rolesui-0.6.139...rolesui-0.6.140) (2026-07-03) - -## [0.6.139](https://github.com/jdwlabs/apps/compare/rolesui-0.6.138...rolesui-0.6.139) (2026-07-03) - -## [0.6.138](https://github.com/jdwlabs/apps/compare/rolesui-0.6.137...rolesui-0.6.138) (2026-07-03) - -## [0.6.137](https://github.com/jdwlabs/apps/compare/rolesui-0.6.136...rolesui-0.6.137) (2026-07-03) - -## [0.6.136](https://github.com/jdwlabs/apps/compare/rolesui-0.6.135...rolesui-0.6.136) (2026-07-03) - -## [0.6.135](https://github.com/jdwlabs/apps/compare/rolesui-0.6.134...rolesui-0.6.135) (2026-07-03) - -## [0.6.134](https://github.com/jdwlabs/apps/compare/rolesui-0.6.133...rolesui-0.6.134) (2026-07-03) - -## [0.6.133](https://github.com/jdwlabs/apps/compare/rolesui-0.6.132...rolesui-0.6.133) (2026-07-03) - -## [0.6.132](https://github.com/jdwlabs/apps/compare/rolesui-0.6.131...rolesui-0.6.132) (2026-07-03) - -## [0.6.131](https://github.com/jdwlabs/apps/compare/rolesui-0.6.130...rolesui-0.6.131) (2026-07-03) - -## [0.6.130](https://github.com/jdwlabs/apps/compare/rolesui-0.6.129...rolesui-0.6.130) (2026-07-03) - -## [0.6.129](https://github.com/jdwlabs/apps/compare/rolesui-0.6.128...rolesui-0.6.129) (2026-07-03) - -## [0.6.128](https://github.com/jdwlabs/apps/compare/rolesui-0.6.127...rolesui-0.6.128) (2026-07-03) - -## [0.6.127](https://github.com/jdwlabs/apps/compare/rolesui-0.6.126...rolesui-0.6.127) (2026-07-03) - -## [0.6.126](https://github.com/jdwlabs/apps/compare/rolesui-0.6.125...rolesui-0.6.126) (2026-07-03) - -## [0.6.125](https://github.com/jdwlabs/apps/compare/rolesui-0.6.124...rolesui-0.6.125) (2026-07-03) - -## [0.6.124](https://github.com/jdwlabs/apps/compare/rolesui-0.6.123...rolesui-0.6.124) (2026-07-03) - -## [0.6.123](https://github.com/jdwlabs/apps/compare/rolesui-0.6.122...rolesui-0.6.123) (2026-07-03) - -## [0.6.122](https://github.com/jdwlabs/apps/compare/rolesui-0.6.121...rolesui-0.6.122) (2026-07-03) - -## [0.6.121](https://github.com/jdwlabs/apps/compare/rolesui-0.6.120...rolesui-0.6.121) (2026-07-03) - -## [0.6.120](https://github.com/jdwlabs/apps/compare/rolesui-0.6.119...rolesui-0.6.120) (2026-07-03) - -## [0.6.119](https://github.com/jdwlabs/apps/compare/rolesui-0.6.118...rolesui-0.6.119) (2026-07-03) - -## [0.6.118](https://github.com/jdwlabs/apps/compare/rolesui-0.6.117...rolesui-0.6.118) (2026-07-03) - -## [0.6.117](https://github.com/jdwlabs/apps/compare/rolesui-0.6.116...rolesui-0.6.117) (2026-07-03) - -## [0.6.116](https://github.com/jdwlabs/apps/compare/rolesui-0.6.115...rolesui-0.6.116) (2026-07-03) - -## [0.6.115](https://github.com/jdwlabs/apps/compare/rolesui-0.6.114...rolesui-0.6.115) (2026-07-03) - -## [0.6.114](https://github.com/jdwlabs/apps/compare/rolesui-0.6.113...rolesui-0.6.114) (2026-07-03) - -## [0.6.113](https://github.com/jdwlabs/apps/compare/rolesui-0.6.112...rolesui-0.6.113) (2026-07-03) - -## [0.6.112](https://github.com/jdwlabs/apps/compare/rolesui-0.6.111...rolesui-0.6.112) (2026-07-03) - -## [0.6.111](https://github.com/jdwlabs/apps/compare/rolesui-0.6.110...rolesui-0.6.111) (2026-07-03) - -## [0.6.110](https://github.com/jdwlabs/apps/compare/rolesui-0.6.109...rolesui-0.6.110) (2026-07-03) - -## [0.6.109](https://github.com/jdwlabs/apps/compare/rolesui-0.6.108...rolesui-0.6.109) (2026-07-03) - -## [0.6.108](https://github.com/jdwlabs/apps/compare/rolesui-0.6.107...rolesui-0.6.108) (2026-07-03) - -## [0.6.107](https://github.com/jdwlabs/apps/compare/rolesui-0.6.106...rolesui-0.6.107) (2026-07-03) - -## [0.6.106](https://github.com/jdwlabs/apps/compare/rolesui-0.6.105...rolesui-0.6.106) (2026-07-03) - -## [0.6.105](https://github.com/jdwlabs/apps/compare/rolesui-0.6.104...rolesui-0.6.105) (2026-07-03) - -## [0.6.104](https://github.com/jdwlabs/apps/compare/rolesui-0.6.103...rolesui-0.6.104) (2026-07-03) - -## [0.6.103](https://github.com/jdwlabs/apps/compare/rolesui-0.6.102...rolesui-0.6.103) (2026-07-03) - -## [0.6.102](https://github.com/jdwlabs/apps/compare/rolesui-0.6.101...rolesui-0.6.102) (2026-07-03) - -## [0.6.101](https://github.com/jdwlabs/apps/compare/rolesui-0.6.100...rolesui-0.6.101) (2026-07-03) - -## [0.6.100](https://github.com/jdwlabs/apps/compare/rolesui-0.6.99...rolesui-0.6.100) (2026-07-03) - -## [0.6.99](https://github.com/jdwlabs/apps/compare/rolesui-0.6.98...rolesui-0.6.99) (2026-07-03) - -## [0.6.98](https://github.com/jdwlabs/apps/compare/rolesui-0.6.97...rolesui-0.6.98) (2026-07-03) - -## [0.6.97](https://github.com/jdwlabs/apps/compare/rolesui-0.6.96...rolesui-0.6.97) (2026-07-03) - -## [0.6.96](https://github.com/jdwlabs/apps/compare/rolesui-0.6.95...rolesui-0.6.96) (2026-07-03) - -## [0.6.95](https://github.com/jdwlabs/apps/compare/rolesui-0.6.94...rolesui-0.6.95) (2026-07-03) - -## [0.6.94](https://github.com/jdwlabs/apps/compare/rolesui-0.6.93...rolesui-0.6.94) (2026-07-03) - -## [0.6.93](https://github.com/jdwlabs/apps/compare/rolesui-0.6.92...rolesui-0.6.93) (2026-07-03) - -## [0.6.92](https://github.com/jdwlabs/apps/compare/rolesui-0.6.91...rolesui-0.6.92) (2026-07-03) - -## [0.6.91](https://github.com/jdwlabs/apps/compare/rolesui-0.6.90...rolesui-0.6.91) (2026-07-03) - -## [0.6.90](https://github.com/jdwlabs/apps/compare/rolesui-0.6.89...rolesui-0.6.90) (2026-07-03) - -## [0.6.89](https://github.com/jdwlabs/apps/compare/rolesui-0.6.88...rolesui-0.6.89) (2026-07-03) - -## [0.6.88](https://github.com/jdwlabs/apps/compare/rolesui-0.6.87...rolesui-0.6.88) (2026-07-03) - -## [0.6.87](https://github.com/jdwlabs/apps/compare/rolesui-0.6.86...rolesui-0.6.87) (2026-07-03) - -## [0.6.86](https://github.com/jdwlabs/apps/compare/rolesui-0.6.85...rolesui-0.6.86) (2026-07-03) - -## [0.6.85](https://github.com/jdwlabs/apps/compare/rolesui-0.6.84...rolesui-0.6.85) (2026-07-03) - -## [0.6.84](https://github.com/jdwlabs/apps/compare/rolesui-0.6.83...rolesui-0.6.84) (2026-07-03) - -## [0.6.83](https://github.com/jdwlabs/apps/compare/rolesui-0.6.82...rolesui-0.6.83) (2026-07-03) - -## [0.6.82](https://github.com/jdwlabs/apps/compare/rolesui-0.6.81...rolesui-0.6.82) (2026-07-03) - -## [0.6.81](https://github.com/jdwlabs/apps/compare/rolesui-0.6.80...rolesui-0.6.81) (2026-07-03) - -## [0.6.80](https://github.com/jdwlabs/apps/compare/rolesui-0.6.79...rolesui-0.6.80) (2026-07-03) - -## [0.6.79](https://github.com/jdwlabs/apps/compare/rolesui-0.6.78...rolesui-0.6.79) (2026-07-03) - -## [0.6.78](https://github.com/jdwlabs/apps/compare/rolesui-0.6.77...rolesui-0.6.78) (2026-07-03) - -## [0.6.77](https://github.com/jdwlabs/apps/compare/rolesui-0.6.76...rolesui-0.6.77) (2026-07-03) - -## [0.6.76](https://github.com/jdwlabs/apps/compare/rolesui-0.6.75...rolesui-0.6.76) (2026-07-03) - -## [0.6.75](https://github.com/jdwlabs/apps/compare/rolesui-0.6.74...rolesui-0.6.75) (2026-07-03) - -## [0.6.74](https://github.com/jdwlabs/apps/compare/rolesui-0.6.73...rolesui-0.6.74) (2026-07-03) - -## [0.6.73](https://github.com/jdwlabs/apps/compare/rolesui-0.6.72...rolesui-0.6.73) (2026-07-03) - -## [0.6.72](https://github.com/jdwlabs/apps/compare/rolesui-0.6.71...rolesui-0.6.72) (2026-07-03) - -## [0.6.71](https://github.com/jdwlabs/apps/compare/rolesui-0.6.70...rolesui-0.6.71) (2026-07-03) - -## [0.6.70](https://github.com/jdwlabs/apps/compare/rolesui-0.6.69...rolesui-0.6.70) (2026-07-03) - -## [0.6.69](https://github.com/jdwlabs/apps/compare/rolesui-0.6.68...rolesui-0.6.69) (2026-07-03) - -## [0.6.68](https://github.com/jdwlabs/apps/compare/rolesui-0.6.67...rolesui-0.6.68) (2026-07-03) - -## [0.6.67](https://github.com/jdwlabs/apps/compare/rolesui-0.6.66...rolesui-0.6.67) (2026-07-03) - -## [0.6.66](https://github.com/jdwlabs/apps/compare/rolesui-0.6.65...rolesui-0.6.66) (2026-07-03) - -## [0.6.65](https://github.com/jdwlabs/apps/compare/rolesui-0.6.64...rolesui-0.6.65) (2026-07-03) - -## [0.6.64](https://github.com/jdwlabs/apps/compare/rolesui-0.6.63...rolesui-0.6.64) (2026-07-03) - -## [0.6.63](https://github.com/jdwlabs/apps/compare/rolesui-0.6.62...rolesui-0.6.63) (2026-07-03) - -## [0.6.62](https://github.com/jdwlabs/apps/compare/rolesui-0.6.61...rolesui-0.6.62) (2026-07-03) - -## [0.6.61](https://github.com/jdwlabs/apps/compare/rolesui-0.6.60...rolesui-0.6.61) (2026-07-03) - -## [0.6.60](https://github.com/jdwlabs/apps/compare/rolesui-0.6.59...rolesui-0.6.60) (2026-07-03) - -## [0.6.59](https://github.com/jdwlabs/apps/compare/rolesui-0.6.58...rolesui-0.6.59) (2026-07-03) - -## [0.6.58](https://github.com/jdwlabs/apps/compare/rolesui-0.6.57...rolesui-0.6.58) (2026-07-03) - -## [0.6.57](https://github.com/jdwlabs/apps/compare/rolesui-0.6.56...rolesui-0.6.57) (2026-07-03) - -## [0.6.56](https://github.com/jdwlabs/apps/compare/rolesui-0.6.55...rolesui-0.6.56) (2026-07-03) - -## [0.6.55](https://github.com/jdwlabs/apps/compare/rolesui-0.6.54...rolesui-0.6.55) (2026-07-03) - -## [0.6.54](https://github.com/jdwlabs/apps/compare/rolesui-0.6.53...rolesui-0.6.54) (2026-07-03) - -## [0.6.53](https://github.com/jdwlabs/apps/compare/rolesui-0.6.52...rolesui-0.6.53) (2026-07-03) - -## [0.6.52](https://github.com/jdwlabs/apps/compare/rolesui-0.6.51...rolesui-0.6.52) (2026-07-03) - -## [0.6.51](https://github.com/jdwlabs/apps/compare/rolesui-0.6.50...rolesui-0.6.51) (2026-07-03) - -## [0.6.50](https://github.com/jdwlabs/apps/compare/rolesui-0.6.49...rolesui-0.6.50) (2026-07-03) - -## [0.6.49](https://github.com/jdwlabs/apps/compare/rolesui-0.6.48...rolesui-0.6.49) (2026-07-03) - -## [0.6.48](https://github.com/jdwlabs/apps/compare/rolesui-0.6.47...rolesui-0.6.48) (2026-07-03) - -## [0.6.47](https://github.com/jdwlabs/apps/compare/rolesui-0.6.46...rolesui-0.6.47) (2026-07-03) - -## [0.6.46](https://github.com/jdwlabs/apps/compare/rolesui-0.6.45...rolesui-0.6.46) (2026-07-03) - -## [0.6.45](https://github.com/jdwlabs/apps/compare/rolesui-0.6.44...rolesui-0.6.45) (2026-07-03) - -## [0.6.44](https://github.com/jdwlabs/apps/compare/rolesui-0.6.43...rolesui-0.6.44) (2026-07-03) - -## [0.6.43](https://github.com/jdwlabs/apps/compare/rolesui-0.6.42...rolesui-0.6.43) (2026-07-03) - -## [0.6.42](https://github.com/jdwlabs/apps/compare/rolesui-0.6.41...rolesui-0.6.42) (2026-07-03) - -## [0.6.41](https://github.com/jdwlabs/apps/compare/rolesui-0.6.40...rolesui-0.6.41) (2026-07-03) - -## [0.6.40](https://github.com/jdwlabs/apps/compare/rolesui-0.6.39...rolesui-0.6.40) (2026-07-03) - -## [0.6.39](https://github.com/jdwlabs/apps/compare/rolesui-0.6.38...rolesui-0.6.39) (2026-07-03) - -## [0.6.38](https://github.com/jdwlabs/apps/compare/rolesui-0.6.37...rolesui-0.6.38) (2026-07-03) - -## [0.6.37](https://github.com/jdwlabs/apps/compare/rolesui-0.6.36...rolesui-0.6.37) (2026-07-03) - -## [0.6.36](https://github.com/jdwlabs/apps/compare/rolesui-0.6.35...rolesui-0.6.36) (2026-07-03) - -## [0.6.35](https://github.com/jdwlabs/apps/compare/rolesui-0.6.34...rolesui-0.6.35) (2026-07-03) - -## [0.6.34](https://github.com/jdwlabs/apps/compare/rolesui-0.6.33...rolesui-0.6.34) (2026-07-03) - -## [0.6.33](https://github.com/jdwlabs/apps/compare/rolesui-0.6.32...rolesui-0.6.33) (2026-07-03) - -## [0.6.32](https://github.com/jdwlabs/apps/compare/rolesui-0.6.31...rolesui-0.6.32) (2026-07-03) - -## [0.6.31](https://github.com/jdwlabs/apps/compare/rolesui-0.6.30...rolesui-0.6.31) (2026-07-03) - -## [0.6.30](https://github.com/jdwlabs/apps/compare/rolesui-0.6.29...rolesui-0.6.30) (2026-07-03) - -## [0.6.29](https://github.com/jdwlabs/apps/compare/rolesui-0.6.28...rolesui-0.6.29) (2026-07-03) - -## [0.6.28](https://github.com/jdwlabs/apps/compare/rolesui-0.6.27...rolesui-0.6.28) (2026-07-03) - -## [0.6.27](https://github.com/jdwlabs/apps/compare/rolesui-0.6.26...rolesui-0.6.27) (2026-07-03) - -## [0.6.26](https://github.com/jdwlabs/apps/compare/rolesui-0.6.25...rolesui-0.6.26) (2026-07-03) - -## [0.6.25](https://github.com/jdwlabs/apps/compare/rolesui-0.6.24...rolesui-0.6.25) (2026-07-03) - -## [0.6.24](https://github.com/jdwlabs/apps/compare/rolesui-0.6.23...rolesui-0.6.24) (2026-07-01) - -## [0.6.23](https://github.com/jdwlabs/apps/compare/rolesui-0.6.22...rolesui-0.6.23) (2026-07-01) - -## [0.6.22](https://github.com/jdwlabs/apps/compare/rolesui-0.6.21...rolesui-0.6.22) (2026-07-01) - -## [0.6.21](https://github.com/jdwlabs/apps/compare/rolesui-0.6.20...rolesui-0.6.21) (2026-07-01) - -## [0.6.20](https://github.com/jdwlabs/apps/compare/rolesui-0.6.19...rolesui-0.6.20) (2026-07-01) - -## [0.6.19](https://github.com/jdwlabs/apps/compare/rolesui-0.6.18...rolesui-0.6.19) (2026-07-01) - -## [0.6.18](https://github.com/jdwlabs/apps/compare/rolesui-0.6.17...rolesui-0.6.18) (2026-07-01) - -## [0.6.17](https://github.com/jdwlabs/apps/compare/rolesui-0.6.16...rolesui-0.6.17) (2026-07-01) - -## [0.6.16](https://github.com/jdwlabs/apps/compare/rolesui-0.6.15...rolesui-0.6.16) (2026-07-01) - -## [0.6.15](https://github.com/jdwlabs/apps/compare/rolesui-0.6.14...rolesui-0.6.15) (2026-07-01) - -## [0.6.14](https://github.com/jdwlabs/apps/compare/rolesui-0.6.13...rolesui-0.6.14) (2026-07-01) - -## [0.6.13](https://github.com/jdwlabs/apps/compare/rolesui-0.6.12...rolesui-0.6.13) (2026-07-01) - -## [0.6.12](https://github.com/jdwlabs/apps/compare/rolesui-0.6.11...rolesui-0.6.12) (2026-07-01) - -## [0.6.11](https://github.com/jdwlabs/apps/compare/rolesui-0.6.10...rolesui-0.6.11) (2026-07-01) - -## [0.6.10](https://github.com/jdwlabs/apps/compare/rolesui-0.6.9...rolesui-0.6.10) (2026-07-01) - -## [0.6.9](https://github.com/jdwlabs/apps/compare/rolesui-0.6.8...rolesui-0.6.9) (2026-07-01) - -## [0.6.8](https://github.com/jdwlabs/apps/compare/rolesui-0.6.7...rolesui-0.6.8) (2026-07-01) - -## [0.6.7](https://github.com/jdwlabs/apps/compare/rolesui-0.6.6...rolesui-0.6.7) (2026-07-01) - -## [0.6.6](https://github.com/jdwlabs/apps/compare/rolesui-0.6.5...rolesui-0.6.6) (2026-07-01) - -## [0.6.5](https://github.com/jdwlabs/apps/compare/rolesui-0.6.4...rolesui-0.6.5) (2026-07-01) - -## [0.6.4](https://github.com/jdwlabs/apps/compare/rolesui-0.6.3...rolesui-0.6.4) (2026-07-01) - -## [0.6.3](https://github.com/jdwlabs/apps/compare/rolesui-0.6.2...rolesui-0.6.3) (2026-07-01) - -## [0.6.2](https://github.com/jdwlabs/apps/compare/rolesui-0.6.1...rolesui-0.6.2) (2026-07-01) - -## [0.6.1](https://github.com/jdwlabs/apps/compare/rolesui-0.6.0...rolesui-0.6.1) (2026-07-01) - -## [0.6.0](https://github.com/jdwlabs/apps/compare/rolesui-0.5.1...rolesui-0.6.0) (2026-07-01) - -### Features - -- **apps:** enrich all images with OCI labels and Overview sync ([bfd1325](https://github.com/jdwlabs/apps/commit/bfd1325172d58ceb042b9eb2994f1105d1cdce53)) - ## [0.5.1](https://github.com/jdwlabs/apps/compare/rolesui-0.5.0...rolesui-0.5.1) (2026-06-08) ### Bug Fixes diff --git a/apps/frontend/rolesui/README.docker.md b/apps/frontend/rolesui/README.docker.md deleted file mode 100644 index 0c2343dff..000000000 --- a/apps/frontend/rolesui/README.docker.md +++ /dev/null @@ -1,45 +0,0 @@ -# jdwlabs/rolesui - -Roles management **micro-frontend** for the jdwlabs platform. - -![Docker Image Version](https://img.shields.io/docker/v/jdwlabs/rolesui?sort=semver) -![Docker Image Size](https://img.shields.io/docker/image-size/jdwlabs/rolesui/latest) -![Docker Pulls](https://img.shields.io/docker/pulls/jdwlabs/rolesui) - -## What it is - -A module-federation remote exposing the platform's role viewing and management UI. It -is loaded at runtime by the `jdwlabs/container` host shell and is not intended to be -browsed on its own. Served by nginx from a static build. - -## Quick start - -```bash -docker run -p 8080:80 jdwlabs/rolesui:latest -``` - -## Exposed ports - -| Port | Purpose | -| ---- | ------------ | -| `80` | nginx (HTTP) | - -## Environment variables - -Runtime config is injected at container start: `start-nginx.sh` runs `envsubst` over -the built JS, substituting any `$NAME` placeholder with the value of the matching -environment variable before nginx starts. Set the platform's config values (API URL) -as environment variables at deployment time; no rebuild is needed to repoint an -environment. - -## Tags - -| Tag | Meaning | -| ----------- | ------------------------------ | -| `latest` | most recent release | -| `{version}` | specific semver (e.g. `1.2.3`) | - -## Source & license - -Source: -License: PolyForm Noncommercial 1.0.0 diff --git a/apps/frontend/rolesui/jest.config.ts b/apps/frontend/rolesui/jest.config.ts new file mode 100644 index 000000000..dd9016d9c --- /dev/null +++ b/apps/frontend/rolesui/jest.config.ts @@ -0,0 +1,21 @@ +module.exports = { + displayName: 'rolesui', + preset: '../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../coverage/apps/frontend/rolesui', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/apps/frontend/rolesui/project.json b/apps/frontend/rolesui/project.json index c278fef44..8ba3141db 100644 --- a/apps/frontend/rolesui/project.json +++ b/apps/frontend/rolesui/project.json @@ -5,12 +5,6 @@ "prefix": "app", "sourceRoot": "apps/frontend/rolesui/src", "tags": ["type:app", "scope:rolesui", "framework:angular"], - "release": { - "version": { - "versionActions": "./tools/release/text-file-version-actions.ts", - "manifestRootsToUpdate": ["{projectRoot}/public"] - } - }, "targets": { "build": { "executor": "@nx/angular:webpack-browser", @@ -136,10 +130,10 @@ "executor": "@nx/eslint:lint" }, "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "apps/frontend/rolesui/jest.config.ts" } }, "serve-static": { @@ -159,6 +153,17 @@ } } }, + "version": { + "executor": "@jscutlery/semver:version", + "options": { + "push": true, + "preset": "conventionalcommits", + "postTargets": ["format", "save-version", "build-image", "update-app"] + } + }, + "save-version": { + "command": "bash scripts/create-version.sh {version} {projectRoot}/public {projectName}" + }, "build-image": { "executor": "nx:run-commands", "dependsOn": ["^build", "prepare-config", "build"], @@ -173,7 +178,7 @@ "forwardAllArgs": false }, { - "command": "bash scripts/build-image.sh rolesui \"$(tr -d '[:space:]' < apps/frontend/rolesui/public/VERSION)\" {projectRoot}/Dockerfile \"Roles management micro-frontend for the jdwlabs platform\" --platform linux/amd64,linux/arm64 --push", + "command": "docker buildx build --platform linux/amd64,linux/arm64 -f {projectRoot}/Dockerfile -t jdwlabs/rolesui:latest -t jdwlabs/rolesui:{version} --push .", "forwardAllArgs": false }, { @@ -190,7 +195,7 @@ "options": { "commands": [ { - "command": "bash scripts/build-image.sh rolesui local {projectRoot}/Dockerfile \"Roles management micro-frontend for the jdwlabs platform\" --load", + "command": "docker buildx build -f {projectRoot}/Dockerfile -t jdwlabs/rolesui:latest --load .", "forwardAllArgs": false }, { @@ -202,10 +207,10 @@ } }, "update-app": { - "command": "bash scripts/update-app.sh charts/rolesui/Chart.yaml \"$(tr -d '[:space:]' < apps/frontend/rolesui/public/VERSION)\" {projectName}" + "command": "bash scripts/update-app.sh charts/rolesui/Chart.yaml {version} {projectName}" }, - "update-description": { - "command": "bash scripts/update-description.sh jdwlabs/rolesui {projectRoot}/README.docker.md" + "format": { + "command": "bash scripts/format.sh" }, "serve-container": { "executor": "nx:run-commands", diff --git a/apps/frontend/rolesui/public/VERSION b/apps/frontend/rolesui/public/VERSION index 3eefcb9dd..8f0916f76 100644 --- a/apps/frontend/rolesui/public/VERSION +++ b/apps/frontend/rolesui/public/VERSION @@ -1 +1 @@ -1.0.0 +0.5.0 diff --git a/apps/frontend/rolesui/src/test-setup.ts b/apps/frontend/rolesui/src/test-setup.ts index 34e7490bc..ea414013f 100644 --- a/apps/frontend/rolesui/src/test-setup.ts +++ b/apps/frontend/rolesui/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/apps/frontend/rolesui/tsconfig.spec.json b/apps/frontend/rolesui/tsconfig.spec.json index 3e894da6f..13be072e3 100644 --- a/apps/frontend/rolesui/tsconfig.spec.json +++ b/apps/frontend/rolesui/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/apps/frontend/rolesui/vite.config.ts b/apps/frontend/rolesui/vite.config.ts deleted file mode 100644 index 0b944b31b..000000000 --- a/apps/frontend/rolesui/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../coverage/apps/frontend/rolesui', -); diff --git a/apps/frontend/usersui/CHANGELOG.md b/apps/frontend/usersui/CHANGELOG.md index b5c0b2f5f..b2ab58635 100644 --- a/apps/frontend/usersui/CHANGELOG.md +++ b/apps/frontend/usersui/CHANGELOG.md @@ -1,497 +1,7 @@ -# 2.0.0 (2026-07-10) - -### 🚀 Features - -- **apps:** enrich all images with OCI labels and Overview sync ([74feb95c](https://github.com/jdwlabs/apps/commit/74feb95c)) - -### 🩹 Fixes - -- **build:** point config targets at scripts/ not tools/ ([75122982](https://github.com/jdwlabs/apps/commit/75122982)) -- **frontend:** resolve broken theme @use after role-based move (JDWLABS-20) ([2ed97b5a](https://github.com/jdwlabs/apps/commit/2ed97b5a)) -- **structure:** fix stale paths missed during role-based restructure ([a012da32](https://github.com/jdwlabs/apps/commit/a012da32)) - -### 🧱 Updated Dependencies - -- Updated frontend-shared-util to 1.0.0 - -### ❤️ Thank You - -- Claude Opus 4.8 -- Claude Sonnet 4.6 -- Jake Willmsen @jdwillmsen - # Changelog This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). -## [1.4.231](https://github.com/jdwlabs/apps/compare/usersui-1.4.230...usersui-1.4.231) (2026-07-04) - -## [1.4.230](https://github.com/jdwlabs/apps/compare/usersui-1.4.229...usersui-1.4.230) (2026-07-04) - -## [1.4.229](https://github.com/jdwlabs/apps/compare/usersui-1.4.228...usersui-1.4.229) (2026-07-04) - -## [1.4.228](https://github.com/jdwlabs/apps/compare/usersui-1.4.227...usersui-1.4.228) (2026-07-04) - -## [1.4.227](https://github.com/jdwlabs/apps/compare/usersui-1.4.226...usersui-1.4.227) (2026-07-04) - -## [1.4.226](https://github.com/jdwlabs/apps/compare/usersui-1.4.225...usersui-1.4.226) (2026-07-04) - -## [1.4.225](https://github.com/jdwlabs/apps/compare/usersui-1.4.224...usersui-1.4.225) (2026-07-04) - -## [1.4.224](https://github.com/jdwlabs/apps/compare/usersui-1.4.223...usersui-1.4.224) (2026-07-04) - -## [1.4.223](https://github.com/jdwlabs/apps/compare/usersui-1.4.222...usersui-1.4.223) (2026-07-04) - -## [1.4.222](https://github.com/jdwlabs/apps/compare/usersui-1.4.221...usersui-1.4.222) (2026-07-04) - -## [1.4.221](https://github.com/jdwlabs/apps/compare/usersui-1.4.220...usersui-1.4.221) (2026-07-04) - -## [1.4.220](https://github.com/jdwlabs/apps/compare/usersui-1.4.219...usersui-1.4.220) (2026-07-04) - -## [1.4.219](https://github.com/jdwlabs/apps/compare/usersui-1.4.218...usersui-1.4.219) (2026-07-04) - -## [1.4.218](https://github.com/jdwlabs/apps/compare/usersui-1.4.217...usersui-1.4.218) (2026-07-04) - -## [1.4.217](https://github.com/jdwlabs/apps/compare/usersui-1.4.216...usersui-1.4.217) (2026-07-04) - -## [1.4.216](https://github.com/jdwlabs/apps/compare/usersui-1.4.215...usersui-1.4.216) (2026-07-04) - -## [1.4.215](https://github.com/jdwlabs/apps/compare/usersui-1.4.214...usersui-1.4.215) (2026-07-04) - -## [1.4.214](https://github.com/jdwlabs/apps/compare/usersui-1.4.213...usersui-1.4.214) (2026-07-04) - -## [1.4.213](https://github.com/jdwlabs/apps/compare/usersui-1.4.212...usersui-1.4.213) (2026-07-04) - -## [1.4.212](https://github.com/jdwlabs/apps/compare/usersui-1.4.211...usersui-1.4.212) (2026-07-04) - -## [1.4.211](https://github.com/jdwlabs/apps/compare/usersui-1.4.210...usersui-1.4.211) (2026-07-04) - -## [1.4.210](https://github.com/jdwlabs/apps/compare/usersui-1.4.209...usersui-1.4.210) (2026-07-04) - -## [1.4.209](https://github.com/jdwlabs/apps/compare/usersui-1.4.208...usersui-1.4.209) (2026-07-04) - -## [1.4.208](https://github.com/jdwlabs/apps/compare/usersui-1.4.207...usersui-1.4.208) (2026-07-04) - -## [1.4.207](https://github.com/jdwlabs/apps/compare/usersui-1.4.206...usersui-1.4.207) (2026-07-04) - -## [1.4.206](https://github.com/jdwlabs/apps/compare/usersui-1.4.205...usersui-1.4.206) (2026-07-04) - -## [1.4.205](https://github.com/jdwlabs/apps/compare/usersui-1.4.204...usersui-1.4.205) (2026-07-04) - -## [1.4.204](https://github.com/jdwlabs/apps/compare/usersui-1.4.203...usersui-1.4.204) (2026-07-04) - -## [1.4.203](https://github.com/jdwlabs/apps/compare/usersui-1.4.202...usersui-1.4.203) (2026-07-04) - -## [1.4.202](https://github.com/jdwlabs/apps/compare/usersui-1.4.201...usersui-1.4.202) (2026-07-04) - -## [1.4.201](https://github.com/jdwlabs/apps/compare/usersui-1.4.200...usersui-1.4.201) (2026-07-04) - -## [1.4.200](https://github.com/jdwlabs/apps/compare/usersui-1.4.199...usersui-1.4.200) (2026-07-04) - -## [1.4.199](https://github.com/jdwlabs/apps/compare/usersui-1.4.198...usersui-1.4.199) (2026-07-04) - -## [1.4.198](https://github.com/jdwlabs/apps/compare/usersui-1.4.197...usersui-1.4.198) (2026-07-04) - -## [1.4.197](https://github.com/jdwlabs/apps/compare/usersui-1.4.196...usersui-1.4.197) (2026-07-04) - -## [1.4.196](https://github.com/jdwlabs/apps/compare/usersui-1.4.195...usersui-1.4.196) (2026-07-04) - -## [1.4.195](https://github.com/jdwlabs/apps/compare/usersui-1.4.194...usersui-1.4.195) (2026-07-04) - -## [1.4.194](https://github.com/jdwlabs/apps/compare/usersui-1.4.193...usersui-1.4.194) (2026-07-04) - -## [1.4.193](https://github.com/jdwlabs/apps/compare/usersui-1.4.192...usersui-1.4.193) (2026-07-03) - -## [1.4.192](https://github.com/jdwlabs/apps/compare/usersui-1.4.191...usersui-1.4.192) (2026-07-03) - -## [1.4.191](https://github.com/jdwlabs/apps/compare/usersui-1.4.190...usersui-1.4.191) (2026-07-03) - -## [1.4.190](https://github.com/jdwlabs/apps/compare/usersui-1.4.189...usersui-1.4.190) (2026-07-03) - -## [1.4.189](https://github.com/jdwlabs/apps/compare/usersui-1.4.188...usersui-1.4.189) (2026-07-03) - -## [1.4.188](https://github.com/jdwlabs/apps/compare/usersui-1.4.187...usersui-1.4.188) (2026-07-03) - -## [1.4.187](https://github.com/jdwlabs/apps/compare/usersui-1.4.186...usersui-1.4.187) (2026-07-03) - -## [1.4.186](https://github.com/jdwlabs/apps/compare/usersui-1.4.185...usersui-1.4.186) (2026-07-03) - -## [1.4.185](https://github.com/jdwlabs/apps/compare/usersui-1.4.184...usersui-1.4.185) (2026-07-03) - -## [1.4.184](https://github.com/jdwlabs/apps/compare/usersui-1.4.183...usersui-1.4.184) (2026-07-03) - -## [1.4.183](https://github.com/jdwlabs/apps/compare/usersui-1.4.182...usersui-1.4.183) (2026-07-03) - -## [1.4.182](https://github.com/jdwlabs/apps/compare/usersui-1.4.181...usersui-1.4.182) (2026-07-03) - -## [1.4.181](https://github.com/jdwlabs/apps/compare/usersui-1.4.180...usersui-1.4.181) (2026-07-03) - -## [1.4.180](https://github.com/jdwlabs/apps/compare/usersui-1.4.179...usersui-1.4.180) (2026-07-03) - -## [1.4.179](https://github.com/jdwlabs/apps/compare/usersui-1.4.178...usersui-1.4.179) (2026-07-03) - -## [1.4.178](https://github.com/jdwlabs/apps/compare/usersui-1.4.177...usersui-1.4.178) (2026-07-03) - -## [1.4.177](https://github.com/jdwlabs/apps/compare/usersui-1.4.176...usersui-1.4.177) (2026-07-03) - -## [1.4.176](https://github.com/jdwlabs/apps/compare/usersui-1.4.175...usersui-1.4.176) (2026-07-03) - -## [1.4.175](https://github.com/jdwlabs/apps/compare/usersui-1.4.174...usersui-1.4.175) (2026-07-03) - -## [1.4.174](https://github.com/jdwlabs/apps/compare/usersui-1.4.173...usersui-1.4.174) (2026-07-03) - -## [1.4.173](https://github.com/jdwlabs/apps/compare/usersui-1.4.172...usersui-1.4.173) (2026-07-03) - -## [1.4.172](https://github.com/jdwlabs/apps/compare/usersui-1.4.171...usersui-1.4.172) (2026-07-03) - -## [1.4.171](https://github.com/jdwlabs/apps/compare/usersui-1.4.170...usersui-1.4.171) (2026-07-03) - -## [1.4.170](https://github.com/jdwlabs/apps/compare/usersui-1.4.169...usersui-1.4.170) (2026-07-03) - -## [1.4.169](https://github.com/jdwlabs/apps/compare/usersui-1.4.168...usersui-1.4.169) (2026-07-03) - -## [1.4.168](https://github.com/jdwlabs/apps/compare/usersui-1.4.167...usersui-1.4.168) (2026-07-03) - -## [1.4.167](https://github.com/jdwlabs/apps/compare/usersui-1.4.166...usersui-1.4.167) (2026-07-03) - -## [1.4.166](https://github.com/jdwlabs/apps/compare/usersui-1.4.165...usersui-1.4.166) (2026-07-03) - -## [1.4.165](https://github.com/jdwlabs/apps/compare/usersui-1.4.164...usersui-1.4.165) (2026-07-03) - -## [1.4.164](https://github.com/jdwlabs/apps/compare/usersui-1.4.163...usersui-1.4.164) (2026-07-03) - -## [1.4.163](https://github.com/jdwlabs/apps/compare/usersui-1.4.162...usersui-1.4.163) (2026-07-03) - -## [1.4.162](https://github.com/jdwlabs/apps/compare/usersui-1.4.161...usersui-1.4.162) (2026-07-03) - -## [1.4.161](https://github.com/jdwlabs/apps/compare/usersui-1.4.160...usersui-1.4.161) (2026-07-03) - -## [1.4.160](https://github.com/jdwlabs/apps/compare/usersui-1.4.159...usersui-1.4.160) (2026-07-03) - -## [1.4.159](https://github.com/jdwlabs/apps/compare/usersui-1.4.158...usersui-1.4.159) (2026-07-03) - -## [1.4.158](https://github.com/jdwlabs/apps/compare/usersui-1.4.157...usersui-1.4.158) (2026-07-03) - -## [1.4.157](https://github.com/jdwlabs/apps/compare/usersui-1.4.156...usersui-1.4.157) (2026-07-03) - -## [1.4.156](https://github.com/jdwlabs/apps/compare/usersui-1.4.155...usersui-1.4.156) (2026-07-03) - -## [1.4.155](https://github.com/jdwlabs/apps/compare/usersui-1.4.154...usersui-1.4.155) (2026-07-03) - -## [1.4.154](https://github.com/jdwlabs/apps/compare/usersui-1.4.153...usersui-1.4.154) (2026-07-03) - -## [1.4.153](https://github.com/jdwlabs/apps/compare/usersui-1.4.152...usersui-1.4.153) (2026-07-03) - -## [1.4.152](https://github.com/jdwlabs/apps/compare/usersui-1.4.151...usersui-1.4.152) (2026-07-03) - -## [1.4.151](https://github.com/jdwlabs/apps/compare/usersui-1.4.150...usersui-1.4.151) (2026-07-03) - -## [1.4.150](https://github.com/jdwlabs/apps/compare/usersui-1.4.149...usersui-1.4.150) (2026-07-03) - -## [1.4.149](https://github.com/jdwlabs/apps/compare/usersui-1.4.148...usersui-1.4.149) (2026-07-03) - -## [1.4.148](https://github.com/jdwlabs/apps/compare/usersui-1.4.147...usersui-1.4.148) (2026-07-03) - -## [1.4.147](https://github.com/jdwlabs/apps/compare/usersui-1.4.146...usersui-1.4.147) (2026-07-03) - -## [1.4.146](https://github.com/jdwlabs/apps/compare/usersui-1.4.145...usersui-1.4.146) (2026-07-03) - -## [1.4.145](https://github.com/jdwlabs/apps/compare/usersui-1.4.144...usersui-1.4.145) (2026-07-03) - -## [1.4.144](https://github.com/jdwlabs/apps/compare/usersui-1.4.143...usersui-1.4.144) (2026-07-03) - -## [1.4.143](https://github.com/jdwlabs/apps/compare/usersui-1.4.142...usersui-1.4.143) (2026-07-03) - -## [1.4.142](https://github.com/jdwlabs/apps/compare/usersui-1.4.141...usersui-1.4.142) (2026-07-03) - -## [1.4.141](https://github.com/jdwlabs/apps/compare/usersui-1.4.140...usersui-1.4.141) (2026-07-03) - -## [1.4.140](https://github.com/jdwlabs/apps/compare/usersui-1.4.139...usersui-1.4.140) (2026-07-03) - -## [1.4.139](https://github.com/jdwlabs/apps/compare/usersui-1.4.138...usersui-1.4.139) (2026-07-03) - -## [1.4.138](https://github.com/jdwlabs/apps/compare/usersui-1.4.137...usersui-1.4.138) (2026-07-03) - -## [1.4.137](https://github.com/jdwlabs/apps/compare/usersui-1.4.136...usersui-1.4.137) (2026-07-03) - -## [1.4.136](https://github.com/jdwlabs/apps/compare/usersui-1.4.135...usersui-1.4.136) (2026-07-03) - -## [1.4.135](https://github.com/jdwlabs/apps/compare/usersui-1.4.134...usersui-1.4.135) (2026-07-03) - -## [1.4.134](https://github.com/jdwlabs/apps/compare/usersui-1.4.133...usersui-1.4.134) (2026-07-03) - -## [1.4.133](https://github.com/jdwlabs/apps/compare/usersui-1.4.132...usersui-1.4.133) (2026-07-03) - -## [1.4.132](https://github.com/jdwlabs/apps/compare/usersui-1.4.131...usersui-1.4.132) (2026-07-03) - -## [1.4.131](https://github.com/jdwlabs/apps/compare/usersui-1.4.130...usersui-1.4.131) (2026-07-03) - -## [1.4.130](https://github.com/jdwlabs/apps/compare/usersui-1.4.129...usersui-1.4.130) (2026-07-03) - -## [1.4.129](https://github.com/jdwlabs/apps/compare/usersui-1.4.128...usersui-1.4.129) (2026-07-03) - -## [1.4.128](https://github.com/jdwlabs/apps/compare/usersui-1.4.127...usersui-1.4.128) (2026-07-03) - -## [1.4.127](https://github.com/jdwlabs/apps/compare/usersui-1.4.126...usersui-1.4.127) (2026-07-03) - -## [1.4.126](https://github.com/jdwlabs/apps/compare/usersui-1.4.125...usersui-1.4.126) (2026-07-03) - -## [1.4.125](https://github.com/jdwlabs/apps/compare/usersui-1.4.124...usersui-1.4.125) (2026-07-03) - -## [1.4.124](https://github.com/jdwlabs/apps/compare/usersui-1.4.123...usersui-1.4.124) (2026-07-03) - -## [1.4.123](https://github.com/jdwlabs/apps/compare/usersui-1.4.122...usersui-1.4.123) (2026-07-03) - -## [1.4.122](https://github.com/jdwlabs/apps/compare/usersui-1.4.121...usersui-1.4.122) (2026-07-03) - -## [1.4.121](https://github.com/jdwlabs/apps/compare/usersui-1.4.120...usersui-1.4.121) (2026-07-03) - -## [1.4.120](https://github.com/jdwlabs/apps/compare/usersui-1.4.119...usersui-1.4.120) (2026-07-03) - -## [1.4.119](https://github.com/jdwlabs/apps/compare/usersui-1.4.118...usersui-1.4.119) (2026-07-03) - -## [1.4.118](https://github.com/jdwlabs/apps/compare/usersui-1.4.117...usersui-1.4.118) (2026-07-03) - -## [1.4.117](https://github.com/jdwlabs/apps/compare/usersui-1.4.116...usersui-1.4.117) (2026-07-03) - -## [1.4.116](https://github.com/jdwlabs/apps/compare/usersui-1.4.115...usersui-1.4.116) (2026-07-03) - -## [1.4.115](https://github.com/jdwlabs/apps/compare/usersui-1.4.114...usersui-1.4.115) (2026-07-03) - -## [1.4.114](https://github.com/jdwlabs/apps/compare/usersui-1.4.113...usersui-1.4.114) (2026-07-03) - -## [1.4.113](https://github.com/jdwlabs/apps/compare/usersui-1.4.112...usersui-1.4.113) (2026-07-03) - -## [1.4.112](https://github.com/jdwlabs/apps/compare/usersui-1.4.111...usersui-1.4.112) (2026-07-03) - -## [1.4.111](https://github.com/jdwlabs/apps/compare/usersui-1.4.110...usersui-1.4.111) (2026-07-03) - -## [1.4.110](https://github.com/jdwlabs/apps/compare/usersui-1.4.109...usersui-1.4.110) (2026-07-03) - -## [1.4.109](https://github.com/jdwlabs/apps/compare/usersui-1.4.108...usersui-1.4.109) (2026-07-03) - -## [1.4.108](https://github.com/jdwlabs/apps/compare/usersui-1.4.107...usersui-1.4.108) (2026-07-03) - -## [1.4.107](https://github.com/jdwlabs/apps/compare/usersui-1.4.106...usersui-1.4.107) (2026-07-03) - -## [1.4.106](https://github.com/jdwlabs/apps/compare/usersui-1.4.105...usersui-1.4.106) (2026-07-03) - -## [1.4.105](https://github.com/jdwlabs/apps/compare/usersui-1.4.104...usersui-1.4.105) (2026-07-03) - -## [1.4.104](https://github.com/jdwlabs/apps/compare/usersui-1.4.103...usersui-1.4.104) (2026-07-03) - -## [1.4.103](https://github.com/jdwlabs/apps/compare/usersui-1.4.102...usersui-1.4.103) (2026-07-03) - -## [1.4.102](https://github.com/jdwlabs/apps/compare/usersui-1.4.101...usersui-1.4.102) (2026-07-03) - -## [1.4.101](https://github.com/jdwlabs/apps/compare/usersui-1.4.100...usersui-1.4.101) (2026-07-03) - -## [1.4.100](https://github.com/jdwlabs/apps/compare/usersui-1.4.99...usersui-1.4.100) (2026-07-03) - -## [1.4.99](https://github.com/jdwlabs/apps/compare/usersui-1.4.98...usersui-1.4.99) (2026-07-03) - -## [1.4.98](https://github.com/jdwlabs/apps/compare/usersui-1.4.97...usersui-1.4.98) (2026-07-03) - -## [1.4.97](https://github.com/jdwlabs/apps/compare/usersui-1.4.96...usersui-1.4.97) (2026-07-03) - -## [1.4.96](https://github.com/jdwlabs/apps/compare/usersui-1.4.95...usersui-1.4.96) (2026-07-03) - -## [1.4.95](https://github.com/jdwlabs/apps/compare/usersui-1.4.94...usersui-1.4.95) (2026-07-03) - -## [1.4.94](https://github.com/jdwlabs/apps/compare/usersui-1.4.93...usersui-1.4.94) (2026-07-03) - -## [1.4.93](https://github.com/jdwlabs/apps/compare/usersui-1.4.92...usersui-1.4.93) (2026-07-03) - -## [1.4.92](https://github.com/jdwlabs/apps/compare/usersui-1.4.91...usersui-1.4.92) (2026-07-03) - -## [1.4.91](https://github.com/jdwlabs/apps/compare/usersui-1.4.90...usersui-1.4.91) (2026-07-03) - -## [1.4.90](https://github.com/jdwlabs/apps/compare/usersui-1.4.89...usersui-1.4.90) (2026-07-03) - -## [1.4.89](https://github.com/jdwlabs/apps/compare/usersui-1.4.88...usersui-1.4.89) (2026-07-03) - -## [1.4.88](https://github.com/jdwlabs/apps/compare/usersui-1.4.87...usersui-1.4.88) (2026-07-03) - -## [1.4.87](https://github.com/jdwlabs/apps/compare/usersui-1.4.86...usersui-1.4.87) (2026-07-03) - -## [1.4.86](https://github.com/jdwlabs/apps/compare/usersui-1.4.85...usersui-1.4.86) (2026-07-03) - -## [1.4.85](https://github.com/jdwlabs/apps/compare/usersui-1.4.84...usersui-1.4.85) (2026-07-03) - -## [1.4.84](https://github.com/jdwlabs/apps/compare/usersui-1.4.83...usersui-1.4.84) (2026-07-03) - -## [1.4.83](https://github.com/jdwlabs/apps/compare/usersui-1.4.82...usersui-1.4.83) (2026-07-03) - -## [1.4.82](https://github.com/jdwlabs/apps/compare/usersui-1.4.81...usersui-1.4.82) (2026-07-03) - -## [1.4.81](https://github.com/jdwlabs/apps/compare/usersui-1.4.80...usersui-1.4.81) (2026-07-03) - -## [1.4.80](https://github.com/jdwlabs/apps/compare/usersui-1.4.79...usersui-1.4.80) (2026-07-03) - -## [1.4.79](https://github.com/jdwlabs/apps/compare/usersui-1.4.78...usersui-1.4.79) (2026-07-03) - -## [1.4.78](https://github.com/jdwlabs/apps/compare/usersui-1.4.77...usersui-1.4.78) (2026-07-03) - -## [1.4.77](https://github.com/jdwlabs/apps/compare/usersui-1.4.76...usersui-1.4.77) (2026-07-03) - -## [1.4.76](https://github.com/jdwlabs/apps/compare/usersui-1.4.75...usersui-1.4.76) (2026-07-03) - -## [1.4.75](https://github.com/jdwlabs/apps/compare/usersui-1.4.74...usersui-1.4.75) (2026-07-03) - -## [1.4.74](https://github.com/jdwlabs/apps/compare/usersui-1.4.73...usersui-1.4.74) (2026-07-03) - -## [1.4.73](https://github.com/jdwlabs/apps/compare/usersui-1.4.72...usersui-1.4.73) (2026-07-03) - -## [1.4.72](https://github.com/jdwlabs/apps/compare/usersui-1.4.71...usersui-1.4.72) (2026-07-03) - -## [1.4.71](https://github.com/jdwlabs/apps/compare/usersui-1.4.70...usersui-1.4.71) (2026-07-03) - -## [1.4.70](https://github.com/jdwlabs/apps/compare/usersui-1.4.69...usersui-1.4.70) (2026-07-03) - -## [1.4.69](https://github.com/jdwlabs/apps/compare/usersui-1.4.68...usersui-1.4.69) (2026-07-03) - -## [1.4.68](https://github.com/jdwlabs/apps/compare/usersui-1.4.67...usersui-1.4.68) (2026-07-03) - -## [1.4.67](https://github.com/jdwlabs/apps/compare/usersui-1.4.66...usersui-1.4.67) (2026-07-03) - -## [1.4.66](https://github.com/jdwlabs/apps/compare/usersui-1.4.65...usersui-1.4.66) (2026-07-03) - -## [1.4.65](https://github.com/jdwlabs/apps/compare/usersui-1.4.64...usersui-1.4.65) (2026-07-03) - -## [1.4.64](https://github.com/jdwlabs/apps/compare/usersui-1.4.63...usersui-1.4.64) (2026-07-03) - -## [1.4.63](https://github.com/jdwlabs/apps/compare/usersui-1.4.62...usersui-1.4.63) (2026-07-03) - -## [1.4.62](https://github.com/jdwlabs/apps/compare/usersui-1.4.61...usersui-1.4.62) (2026-07-03) - -## [1.4.61](https://github.com/jdwlabs/apps/compare/usersui-1.4.60...usersui-1.4.61) (2026-07-03) - -## [1.4.60](https://github.com/jdwlabs/apps/compare/usersui-1.4.59...usersui-1.4.60) (2026-07-03) - -## [1.4.59](https://github.com/jdwlabs/apps/compare/usersui-1.4.58...usersui-1.4.59) (2026-07-03) - -## [1.4.58](https://github.com/jdwlabs/apps/compare/usersui-1.4.57...usersui-1.4.58) (2026-07-03) - -## [1.4.57](https://github.com/jdwlabs/apps/compare/usersui-1.4.56...usersui-1.4.57) (2026-07-03) - -## [1.4.56](https://github.com/jdwlabs/apps/compare/usersui-1.4.55...usersui-1.4.56) (2026-07-03) - -## [1.4.55](https://github.com/jdwlabs/apps/compare/usersui-1.4.54...usersui-1.4.55) (2026-07-03) - -## [1.4.54](https://github.com/jdwlabs/apps/compare/usersui-1.4.53...usersui-1.4.54) (2026-07-03) - -## [1.4.53](https://github.com/jdwlabs/apps/compare/usersui-1.4.52...usersui-1.4.53) (2026-07-03) - -## [1.4.52](https://github.com/jdwlabs/apps/compare/usersui-1.4.51...usersui-1.4.52) (2026-07-03) - -## [1.4.51](https://github.com/jdwlabs/apps/compare/usersui-1.4.50...usersui-1.4.51) (2026-07-03) - -## [1.4.50](https://github.com/jdwlabs/apps/compare/usersui-1.4.49...usersui-1.4.50) (2026-07-03) - -## [1.4.49](https://github.com/jdwlabs/apps/compare/usersui-1.4.48...usersui-1.4.49) (2026-07-03) - -## [1.4.48](https://github.com/jdwlabs/apps/compare/usersui-1.4.47...usersui-1.4.48) (2026-07-03) - -## [1.4.47](https://github.com/jdwlabs/apps/compare/usersui-1.4.46...usersui-1.4.47) (2026-07-03) - -## [1.4.46](https://github.com/jdwlabs/apps/compare/usersui-1.4.45...usersui-1.4.46) (2026-07-03) - -## [1.4.45](https://github.com/jdwlabs/apps/compare/usersui-1.4.44...usersui-1.4.45) (2026-07-03) - -## [1.4.44](https://github.com/jdwlabs/apps/compare/usersui-1.4.43...usersui-1.4.44) (2026-07-03) - -## [1.4.43](https://github.com/jdwlabs/apps/compare/usersui-1.4.42...usersui-1.4.43) (2026-07-03) - -## [1.4.42](https://github.com/jdwlabs/apps/compare/usersui-1.4.41...usersui-1.4.42) (2026-07-03) - -## [1.4.41](https://github.com/jdwlabs/apps/compare/usersui-1.4.40...usersui-1.4.41) (2026-07-01) - -## [1.4.40](https://github.com/jdwlabs/apps/compare/usersui-1.4.39...usersui-1.4.40) (2026-07-01) - -## [1.4.39](https://github.com/jdwlabs/apps/compare/usersui-1.4.38...usersui-1.4.39) (2026-07-01) - -## [1.4.38](https://github.com/jdwlabs/apps/compare/usersui-1.4.37...usersui-1.4.38) (2026-07-01) - -## [1.4.37](https://github.com/jdwlabs/apps/compare/usersui-1.4.36...usersui-1.4.37) (2026-07-01) - -## [1.4.36](https://github.com/jdwlabs/apps/compare/usersui-1.4.35...usersui-1.4.36) (2026-07-01) - -## [1.4.35](https://github.com/jdwlabs/apps/compare/usersui-1.4.34...usersui-1.4.35) (2026-07-01) - -## [1.4.34](https://github.com/jdwlabs/apps/compare/usersui-1.4.33...usersui-1.4.34) (2026-07-01) - -## [1.4.33](https://github.com/jdwlabs/apps/compare/usersui-1.4.32...usersui-1.4.33) (2026-07-01) - -## [1.4.32](https://github.com/jdwlabs/apps/compare/usersui-1.4.31...usersui-1.4.32) (2026-07-01) - -## [1.4.31](https://github.com/jdwlabs/apps/compare/usersui-1.4.30...usersui-1.4.31) (2026-07-01) - -## [1.4.30](https://github.com/jdwlabs/apps/compare/usersui-1.4.29...usersui-1.4.30) (2026-07-01) - -## [1.4.29](https://github.com/jdwlabs/apps/compare/usersui-1.4.28...usersui-1.4.29) (2026-07-01) - -## [1.4.28](https://github.com/jdwlabs/apps/compare/usersui-1.4.27...usersui-1.4.28) (2026-07-01) - -## [1.4.27](https://github.com/jdwlabs/apps/compare/usersui-1.4.26...usersui-1.4.27) (2026-07-01) - -## [1.4.26](https://github.com/jdwlabs/apps/compare/usersui-1.4.25...usersui-1.4.26) (2026-07-01) - -## [1.4.25](https://github.com/jdwlabs/apps/compare/usersui-1.4.24...usersui-1.4.25) (2026-07-01) - -## [1.4.24](https://github.com/jdwlabs/apps/compare/usersui-1.4.23...usersui-1.4.24) (2026-07-01) - -## [1.4.23](https://github.com/jdwlabs/apps/compare/usersui-1.4.22...usersui-1.4.23) (2026-07-01) - -## [1.4.22](https://github.com/jdwlabs/apps/compare/usersui-1.4.21...usersui-1.4.22) (2026-07-01) - -## [1.4.21](https://github.com/jdwlabs/apps/compare/usersui-1.4.20...usersui-1.4.21) (2026-07-01) - -## [1.4.20](https://github.com/jdwlabs/apps/compare/usersui-1.4.19...usersui-1.4.20) (2026-07-01) - -## [1.4.19](https://github.com/jdwlabs/apps/compare/usersui-1.4.18...usersui-1.4.19) (2026-07-01) - -## [1.4.18](https://github.com/jdwlabs/apps/compare/usersui-1.4.17...usersui-1.4.18) (2026-07-01) - -## [1.4.17](https://github.com/jdwlabs/apps/compare/usersui-1.4.16...usersui-1.4.17) (2026-07-01) - -## [1.4.16](https://github.com/jdwlabs/apps/compare/usersui-1.4.15...usersui-1.4.16) (2026-07-01) - -## [1.4.15](https://github.com/jdwlabs/apps/compare/usersui-1.4.14...usersui-1.4.15) (2026-07-01) - -## [1.4.14](https://github.com/jdwlabs/apps/compare/usersui-1.4.13...usersui-1.4.14) (2026-07-01) - -## [1.4.13](https://github.com/jdwlabs/apps/compare/usersui-1.4.12...usersui-1.4.13) (2026-07-01) - -## [1.4.12](https://github.com/jdwlabs/apps/compare/usersui-1.4.11...usersui-1.4.12) (2026-07-01) - -## [1.4.11](https://github.com/jdwlabs/apps/compare/usersui-1.4.10...usersui-1.4.11) (2026-07-01) - -## [1.4.10](https://github.com/jdwlabs/apps/compare/usersui-1.4.9...usersui-1.4.10) (2026-07-01) - -## [1.4.9](https://github.com/jdwlabs/apps/compare/usersui-1.4.8...usersui-1.4.9) (2026-07-01) - -## [1.4.8](https://github.com/jdwlabs/apps/compare/usersui-1.4.7...usersui-1.4.8) (2026-07-01) - -## [1.4.7](https://github.com/jdwlabs/apps/compare/usersui-1.4.6...usersui-1.4.7) (2026-07-01) - -## [1.4.6](https://github.com/jdwlabs/apps/compare/usersui-1.4.5...usersui-1.4.6) (2026-07-01) - -## [1.4.5](https://github.com/jdwlabs/apps/compare/usersui-1.4.4...usersui-1.4.5) (2026-07-01) - -## [1.4.4](https://github.com/jdwlabs/apps/compare/usersui-1.4.3...usersui-1.4.4) (2026-07-01) - -## [1.4.3](https://github.com/jdwlabs/apps/compare/usersui-1.4.2...usersui-1.4.3) (2026-07-01) - -## [1.4.2](https://github.com/jdwlabs/apps/compare/usersui-1.4.1...usersui-1.4.2) (2026-07-01) - -## [1.4.1](https://github.com/jdwlabs/apps/compare/usersui-1.4.0...usersui-1.4.1) (2026-07-01) - -## [1.4.0](https://github.com/jdwlabs/apps/compare/usersui-1.3.2...usersui-1.4.0) (2026-07-01) - -### Features - -- **apps:** enrich all images with OCI labels and Overview sync ([bfd1325](https://github.com/jdwlabs/apps/commit/bfd1325172d58ceb042b9eb2994f1105d1cdce53)) - ## [1.3.2](https://github.com/jdwlabs/apps/compare/usersui-1.3.1...usersui-1.3.2) (2026-06-08) ### Bug Fixes diff --git a/apps/frontend/usersui/README.docker.md b/apps/frontend/usersui/README.docker.md deleted file mode 100644 index e37d6de96..000000000 --- a/apps/frontend/usersui/README.docker.md +++ /dev/null @@ -1,45 +0,0 @@ -# jdwlabs/usersui - -Users management **micro-frontend** for the jdwlabs platform. - -![Docker Image Version](https://img.shields.io/docker/v/jdwlabs/usersui?sort=semver) -![Docker Image Size](https://img.shields.io/docker/image-size/jdwlabs/usersui/latest) -![Docker Pulls](https://img.shields.io/docker/pulls/jdwlabs/usersui) - -## What it is - -A module-federation remote exposing the platform's user viewing and profile management -UI. It is loaded at runtime by the `jdwlabs/container` host shell and is not intended -to be browsed on its own. Served by nginx from a static build. - -## Quick start - -```bash -docker run -p 8080:80 jdwlabs/usersui:latest -``` - -## Exposed ports - -| Port | Purpose | -| ---- | ------------ | -| `80` | nginx (HTTP) | - -## Environment variables - -Runtime config is injected at container start: `start-nginx.sh` runs `envsubst` over -the built JS, substituting any `$NAME` placeholder with the value of the matching -environment variable before nginx starts. Set the platform's config values (API URL) -as environment variables at deployment time; no rebuild is needed to repoint an -environment. - -## Tags - -| Tag | Meaning | -| ----------- | ------------------------------ | -| `latest` | most recent release | -| `{version}` | specific semver (e.g. `1.2.3`) | - -## Source & license - -Source: -License: PolyForm Noncommercial 1.0.0 diff --git a/apps/frontend/usersui/jest.config.ts b/apps/frontend/usersui/jest.config.ts new file mode 100644 index 000000000..1f09494f9 --- /dev/null +++ b/apps/frontend/usersui/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +module.exports = { + displayName: 'usersui', + preset: '../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../coverage/apps/frontend/usersui', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/apps/frontend/usersui/project.json b/apps/frontend/usersui/project.json index 506b2ae31..20f48e6ea 100644 --- a/apps/frontend/usersui/project.json +++ b/apps/frontend/usersui/project.json @@ -5,12 +5,6 @@ "prefix": "app", "sourceRoot": "apps/frontend/usersui/src", "tags": ["type:app", "scope:usersui", "framework:angular"], - "release": { - "version": { - "versionActions": "./tools/release/text-file-version-actions.ts", - "manifestRootsToUpdate": ["{projectRoot}/public"] - } - }, "targets": { "build": { "executor": "@nx/angular:webpack-browser", @@ -136,10 +130,10 @@ "executor": "@nx/eslint:lint" }, "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "apps/frontend/usersui/jest.config.ts" } }, "serve-static": { @@ -159,6 +153,17 @@ } } }, + "version": { + "executor": "@jscutlery/semver:version", + "options": { + "push": true, + "preset": "conventionalcommits", + "postTargets": ["format", "save-version", "build-image", "update-app"] + } + }, + "save-version": { + "command": "bash scripts/create-version.sh {version} {projectRoot}/public {projectName}" + }, "build-image": { "executor": "nx:run-commands", "dependsOn": ["^build", "prepare-config", "build"], @@ -173,7 +178,7 @@ "forwardAllArgs": false }, { - "command": "bash scripts/build-image.sh usersui \"$(tr -d '[:space:]' < apps/frontend/usersui/public/VERSION)\" {projectRoot}/Dockerfile \"Users management micro-frontend for the jdwlabs platform\" --platform linux/amd64,linux/arm64 --push", + "command": "docker buildx build --platform linux/amd64,linux/arm64 -f {projectRoot}/Dockerfile -t jdwlabs/usersui:latest -t jdwlabs/usersui:{version} --push .", "forwardAllArgs": false }, { @@ -190,7 +195,7 @@ "options": { "commands": [ { - "command": "bash scripts/build-image.sh usersui local {projectRoot}/Dockerfile \"Users management micro-frontend for the jdwlabs platform\" --load", + "command": "docker buildx build -f {projectRoot}/Dockerfile -t jdwlabs/usersui:latest --load .", "forwardAllArgs": false }, { @@ -202,10 +207,10 @@ } }, "update-app": { - "command": "bash scripts/update-app.sh charts/usersui/Chart.yaml \"$(tr -d '[:space:]' < apps/frontend/usersui/public/VERSION)\" {projectName}" + "command": "bash scripts/update-app.sh charts/usersui/Chart.yaml {version} {projectName}" }, - "update-description": { - "command": "bash scripts/update-description.sh jdwlabs/usersui {projectRoot}/README.docker.md" + "format": { + "command": "bash scripts/format.sh" }, "serve-container": { "executor": "nx:run-commands", diff --git a/apps/frontend/usersui/public/VERSION b/apps/frontend/usersui/public/VERSION index 227cea215..3a3cd8cc8 100644 --- a/apps/frontend/usersui/public/VERSION +++ b/apps/frontend/usersui/public/VERSION @@ -1 +1 @@ -2.0.0 +1.3.1 diff --git a/apps/frontend/usersui/src/test-setup.ts b/apps/frontend/usersui/src/test-setup.ts index 34e7490bc..ea414013f 100644 --- a/apps/frontend/usersui/src/test-setup.ts +++ b/apps/frontend/usersui/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/apps/frontend/usersui/tsconfig.spec.json b/apps/frontend/usersui/tsconfig.spec.json index 3e894da6f..13be072e3 100644 --- a/apps/frontend/usersui/tsconfig.spec.json +++ b/apps/frontend/usersui/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/apps/frontend/usersui/vite.config.ts b/apps/frontend/usersui/vite.config.ts deleted file mode 100644 index 0a5c260b6..000000000 --- a/apps/frontend/usersui/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../coverage/apps/frontend/usersui', -); diff --git a/docs/architecture.md b/docs/architecture.md index e04a0cb75..d28c5e94f 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -49,7 +49,8 @@ flowchart LR lint --> build["build\naffected"] merge["Merge to main"] - merge --> rel["nx release job\n(version, changelog, tags)"] - rel --> deliver["deliver matrix\n(Docker, Helm, E2E)"] - deliver --> e2e["E2E dispatch"] + merge --> ver["version bump\n@jscutlery/semver"] + ver --> docker["Docker build + push\nDockerHub"] + docker --> helm["Helm chart update"] + helm --> dev["push develop branch"] ``` diff --git a/docs/conventions.md b/docs/conventions.md index 22f0fea0f..0bbed9a58 100644 --- a/docs/conventions.md +++ b/docs/conventions.md @@ -7,13 +7,10 @@ | Type | What goes here | Can import from | | ------------------ | --------------------------------- | --------------------- | | `type:feature` | Smart components, pages, routes | ui, util, data-access | -| `type:ui` | Dumb/presentational components | util only | +| `type:ui` | Dumb/presentational components | ui, util | | `type:data-access` | Services, HTTP, state | util, data-access | | `type:util` | Pure functions, interfaces, pipes | util only | -These rules (plus the scope and framework axes) are enforced by lint, not -just convention — see [Module Boundaries](#module-boundaries). - ### File Naming - Components: `my-thing.component.ts` / `.html` / `.scss` / `.spec.ts` @@ -35,61 +32,9 @@ No barrel files (`index.ts`) at the app level. Import directly from the source f ### Testing - Jest for unit tests (`.spec.ts` alongside the file) -- Playwright for E2E (all tests in `apps/e2e/platform-e2e/`) +- Playwright for E2E (all tests in `apps/angular/platform-e2e/`) - No `TestBed` bootstrapping shortcuts — configure properly with `TestBed.configureTestingModule` -## Module Boundaries - -Every project carries three tag families in its `project.json` (`type:`, -`scope:`, `framework:`). The `@nx/enforce-module-boundaries` rule in -`eslint.config.ts` turns them into hard constraints — a dependency must -satisfy **all** axes that match the importing project, and violations fail -lint in CI. - -### Type axis (layering) - -| Source | May depend on | -| ------------------ | ------------------------------ | -| `type:app` | feature, ui, data-access, util | -| `type:feature` | ui, data-access, util | -| `type:data-access` | data-access, util | -| `type:ui` | util | -| `type:util` | util | -| `type:e2e` | anything (top-level consumer) | - -### Scope axis (app isolation) - -A `scope:X` project may only import `scope:X` or `scope:shared` projects. -`scope:shared` may only import `scope:shared`. Cross-app reuse goes through a -shared lib, never a direct import of another app's scope. - -### Framework axis (no cross-framework imports) - -`framework:angular` code may only import `framework:angular` projects; the -same holds for `go`, `springboot`, `database`, and `node`. ESLint only lints -JS/TS, so in practice this bites on the Angular/Node side; Go and JVM -boundaries are additionally enforced by their own toolchains. - -### Grandfathered exceptions (burn-down list) - -Existing violations that predate enforcement are marked with -`eslint-disable @nx/enforce-module-boundaries` at the import site. Do not add -new ones — fix the layering instead. Current list: - -- `frontend-container-data-access` → `frontend-shared-ui` - (`dynamic-route-loader.service.ts` renders `FallbackComponent` when a - remote fails to load; the component reference should move behind a route - factory or into the feature layer) -- `frontend-shared-data-access` → `frontend-shared-ui` - (`snackbar.service.ts` opens `SnackbarComponent` via `MatSnackBar`; same - remedy — inject or relocate the component) - -### Adding a new project - -Declare all three tag families in `project.json` or the project will not -match the constraints above and its first cross-project import will be -rejected by lint. - ## Go - Standard Go package layout (no internal/ unless needed for encapsulation) diff --git a/docs/release-recovery.md b/docs/release-recovery.md deleted file mode 100644 index 30dfcd14a..000000000 --- a/docs/release-recovery.md +++ /dev/null @@ -1,46 +0,0 @@ -# Release Job Partial-Failure Recovery - -The CI `release` job (`.github/workflows/ci.yml`) runs `nx release --skip-publish` -against the live `main` tip, then the `deliver` matrix builds/publishes each -released project. Because this spans a git push, tag push, GitHub Release -creation, and a Docker Hub matrix, a mid-run failure can leave state partially -applied. This runbook covers recovery for each failure point. - -## (a) Commit pushed, tags missing - -**Symptom:** `Run Nx Release` step fails after `nx release` pushed the version -bump commit to `main` but before (or during) tag creation/push. - -**Recovery:** Re-run the `release` job. `nx release` computes versions from -conventional commits since the last matching tag; since the version-bump -commit is already on `main` and unversioned (no tag points at it yet), the -re-run recomputes the _same_ version for each affected project and pushes the -missing tags. No manual tag creation should be necessary — only reach for a -manual `git tag` + push if the re-run computes a different version than -expected (e.g. an intervening commit landed on `main` first). - -## (b) Tags pushed, GitHub Release missing - -**Symptom:** Tags exist on the released commit, but no GitHub Release was -created (e.g. the job died between tag push and Release API call). - -**Recovery:** Re-running the `release` job no-ops — `nx release` sees the tag -already points at the target commit and won't re-version or re-push. Recover -manually per project: - -```bash -gh release create - --title " " --generate-notes -``` - -## (c) Deliver failure - -**Symptom:** `release` job succeeded (commit + tags + GitHub Release all -landed) but one or more `deliver` matrix jobs failed (Docker build, Helm chart -update, or Docker Hub description push). - -**Recovery:** Idempotent — re-run only the failed matrix job(s) from the -Actions UI ("Re-run failed jobs"). `deliver` reads `needs.release.outputs.sha` -and `matrix` from the already-completed `release` job's outputs, so it -re-runs against the same released commit and project set without re-triggering -`nx release`. Verified safe to re-run: `build-image`, `update-app`, and -`update-description` targets are all safe to repeat against the same version. diff --git a/docs/workflows.md b/docs/workflows.md index 21109eabc..e924ab732 100644 --- a/docs/workflows.md +++ b/docs/workflows.md @@ -4,7 +4,7 @@ ```bash # Generate the library -pnpm exec nx g @nx/angular:library --name=my-lib --directory=libs/frontend/myapp/my-lib --tags="type:util,scope:myapp,framework:angular" +pnpm exec nx g @nx/angular:library --name=my-lib --directory=libs/angular/myapp/my-lib --tags="type:util,scope:myapp,framework:angular" # Run lint + test to verify it's set up correctly pnpm exec nx run :lint @@ -15,7 +15,7 @@ pnpm exec nx run :test ```bash # Generate the app -pnpm exec nx g @nx/angular:application --name=myapp --directory=apps/frontend/myapp/myapp +pnpm exec nx g @nx/angular:application --name=myapp --directory=apps/angular/myapp/myapp ``` Then manually: @@ -60,12 +60,14 @@ git commit -m "feat(container): add dark mode toggle" ## Releasing a New Version -Versioning runs in CI on push to `main`. Do not run `nx release` locally without `--dry-run`. +Versioning runs in CI on push to `main`. Do not run `nx run :version` locally. After merging, CI will: -1. Run `nx release` job: bump versions, generate per-project CHANGELOGs, create tags, publish GitHub Releases -2. Run per-project deliver matrix: Docker image build/push, update Helm chart appVersion, update Docker Hub description -3. Dispatch E2E tests +1. Bump semver (patch/minor/major based on commit types) +2. Generate CHANGELOG +3. Push Docker images to DockerHub +4. Update Helm chart appVersion +5. Push updated files to `develop` branch ## Resetting After a Failed Nx Operation diff --git a/eslint.config.ts b/eslint.config.ts index 0b1b7896e..7c66a3d45 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -8,12 +8,6 @@ export default [ '**/eslint.config.ts', '**/eslint.config.js', '**/eslint.config.mjs', - // vite.config.ts is read directly by Vite (outside Nx's module graph, - // before the tsconfig-paths plugin is active) and test-setup.ts is - // Vitest tooling, not application code -- both import the shared - // tools/testing helpers via relative path rather than a @jdw/* alias. - '**/vite.config.ts', - '**/src/test-setup.ts', ], }, ...nx.configs['flat/base'], @@ -25,11 +19,11 @@ export default [ { enforceBuildableLibDependency: true, allow: [], - // Three independent tag axes (type/scope/framework); a dependency - // must satisfy every constraint that matches the importing project. - // The full rules live in docs/conventions.md#module-boundaries. depConstraints: [ - // type axis: layering, high to low + { + sourceTag: 'scope:shared', + onlyDependOnLibsWithTags: ['scope:shared'], + }, { sourceTag: 'type:app', onlyDependOnLibsWithTags: [ @@ -53,81 +47,12 @@ export default [ }, { sourceTag: 'type:ui', - onlyDependOnLibsWithTags: ['type:util'], + onlyDependOnLibsWithTags: ['type:ui', 'type:util'], }, { sourceTag: 'type:util', onlyDependOnLibsWithTags: ['type:util'], }, - // E2E sits above everything and nothing depends on it, so it may - // import from any project. - { - sourceTag: 'type:e2e', - onlyDependOnLibsWithTags: ['*'], - }, - // scope axis: each app scope sees only itself + shared - { - sourceTag: 'scope:shared', - onlyDependOnLibsWithTags: ['scope:shared'], - }, - { - sourceTag: 'scope:authui', - onlyDependOnLibsWithTags: ['scope:authui', 'scope:shared'], - }, - { - sourceTag: 'scope:container', - onlyDependOnLibsWithTags: ['scope:container', 'scope:shared'], - }, - { - sourceTag: 'scope:rolesui', - onlyDependOnLibsWithTags: ['scope:rolesui', 'scope:shared'], - }, - { - sourceTag: 'scope:usersui', - onlyDependOnLibsWithTags: ['scope:usersui', 'scope:shared'], - }, - { - sourceTag: 'scope:servicediscovery', - onlyDependOnLibsWithTags: [ - 'scope:servicediscovery', - 'scope:shared', - ], - }, - { - sourceTag: 'scope:usersrole', - onlyDependOnLibsWithTags: ['scope:usersrole', 'scope:shared'], - }, - { - sourceTag: 'scope:authdb', - onlyDependOnLibsWithTags: ['scope:authdb', 'scope:shared'], - }, - { - sourceTag: 'scope:ai-sre-relay', - onlyDependOnLibsWithTags: ['scope:ai-sre-relay', 'scope:shared'], - }, - // framework axis: no cross-framework imports. ESLint only lints - // JS/TS, so this bites on the Angular/Node side; Go and JVM code - // is additionally fenced by its own toolchain. - { - sourceTag: 'framework:angular', - onlyDependOnLibsWithTags: ['framework:angular'], - }, - { - sourceTag: 'framework:go', - onlyDependOnLibsWithTags: ['framework:go'], - }, - { - sourceTag: 'framework:springboot', - onlyDependOnLibsWithTags: ['framework:springboot'], - }, - { - sourceTag: 'framework:database', - onlyDependOnLibsWithTags: ['framework:database'], - }, - { - sourceTag: 'framework:node', - onlyDependOnLibsWithTags: ['framework:node'], - }, ], }, ], @@ -145,6 +70,6 @@ export default [ }, { files: ['**/*.spec.ts', '**/*.spec.tsx', '**/*.spec.js', '**/*.spec.jsx'], - languageOptions: { globals: { ...globals.vitest } }, + languageOptions: { globals: { ...globals.jest } }, }, ]; diff --git a/go.work b/go.work index bec81d030..31a88ff41 100644 --- a/go.work +++ b/go.work @@ -1,7 +1,6 @@ -go 1.26 +go 1.23 use ( - ./apps/backend/ai-sre-relay ./apps/backend/servicediscovery ./libs/backend/shared/util ) diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 000000000..075d79f4c --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,5 @@ +const { getJestProjectsAsync } = require('@nx/jest'); + +module.exports = async () => ({ + projects: await getJestProjectsAsync(), +}); diff --git a/jest.preset.js b/jest.preset.js new file mode 100644 index 000000000..f078ddcec --- /dev/null +++ b/jest.preset.js @@ -0,0 +1,3 @@ +const nxPreset = require('@nx/jest/preset').default; + +module.exports = { ...nxPreset }; diff --git a/libs/frontend/authui/feature/core/jest.config.ts b/libs/frontend/authui/feature/core/jest.config.ts new file mode 100644 index 000000000..f1a9264ff --- /dev/null +++ b/libs/frontend/authui/feature/core/jest.config.ts @@ -0,0 +1,23 @@ +/* eslint-disable */ +module.exports = { + displayName: 'frontend-authui-feature-core', + preset: '../../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: + '../../../../../coverage/libs/frontend/authui/feature/core', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/authui/feature/core/project.json b/libs/frontend/authui/feature/core/project.json index ce9a1b7b6..249d77145 100644 --- a/libs/frontend/authui/feature/core/project.json +++ b/libs/frontend/authui/feature/core/project.json @@ -7,10 +7,10 @@ "tags": ["type:feature", "scope:authui", "framework:angular"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/authui/feature/core/jest.config.ts" } }, "lint": { diff --git a/libs/frontend/authui/feature/core/src/test-setup.ts b/libs/frontend/authui/feature/core/src/test-setup.ts index ad8bd0946..ea414013f 100644 --- a/libs/frontend/authui/feature/core/src/test-setup.ts +++ b/libs/frontend/authui/feature/core/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/authui/feature/core/tsconfig.lib.json b/libs/frontend/authui/feature/core/tsconfig.lib.json index 3fbebaa7f..7ac1edba1 100644 --- a/libs/frontend/authui/feature/core/tsconfig.lib.json +++ b/libs/frontend/authui/feature/core/tsconfig.lib.json @@ -8,16 +8,16 @@ "types": [] }, "exclude": [ - "**/*.cy.js", - "**/*.cy.jsx", - "**/*.cy.ts", - "**/*.cy.tsx", - "cypress.config.ts", - "cypress/**/*", - "jest.config.ts", "src/**/*.spec.ts", + "src/test-setup.ts", + "jest.config.ts", "src/**/*.test.ts", - "src/test-setup.ts" + "cypress/**/*", + "cypress.config.ts", + "**/*.cy.ts", + "**/*.cy.js", + "**/*.cy.tsx", + "**/*.cy.jsx" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/authui/feature/core/tsconfig.spec.json b/libs/frontend/authui/feature/core/tsconfig.spec.json index 4e1eb0c3f..b03ed70a5 100644 --- a/libs/frontend/authui/feature/core/tsconfig.spec.json +++ b/libs/frontend/authui/feature/core/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/authui/feature/core/vite.config.ts b/libs/frontend/authui/feature/core/vite.config.ts deleted file mode 100644 index a412ec291..000000000 --- a/libs/frontend/authui/feature/core/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../../coverage/libs/frontend/authui/feature/core', -); diff --git a/libs/frontend/container/data-access/README.md b/libs/frontend/container/data-access/README.md index dc552d381..a4aa14ff0 100644 --- a/libs/frontend/container/data-access/README.md +++ b/libs/frontend/container/data-access/README.md @@ -85,7 +85,7 @@ import { inject } from '@angular/core'; // constructor(private routeLoader: DynamicRouteLoaderService) {} const routeLoader = inject(DynamicRouteLoaderService); -ngOnInit(); +ngOnInit() { this.routeLoader.loadRoutes(); } diff --git a/libs/frontend/container/data-access/jest.config.ts b/libs/frontend/container/data-access/jest.config.ts new file mode 100644 index 000000000..e79d3620a --- /dev/null +++ b/libs/frontend/container/data-access/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +module.exports = { + displayName: 'frontend-container-data-access', + preset: '../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../../coverage/libs/frontend/container/data-access', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/container/data-access/project.json b/libs/frontend/container/data-access/project.json index f9b7ded90..c530c2d9c 100644 --- a/libs/frontend/container/data-access/project.json +++ b/libs/frontend/container/data-access/project.json @@ -7,10 +7,10 @@ "tags": ["type:data-access", "scope:container", "framework:angular"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/container/data-access/jest.config.ts" } } } diff --git a/libs/frontend/container/data-access/src/lib/dynamic-route-loader/dynamic-route-loader.service.spec.ts b/libs/frontend/container/data-access/src/lib/dynamic-route-loader/dynamic-route-loader.service.spec.ts index 5aa018538..b29b32e4a 100644 --- a/libs/frontend/container/data-access/src/lib/dynamic-route-loader/dynamic-route-loader.service.spec.ts +++ b/libs/frontend/container/data-access/src/lib/dynamic-route-loader/dynamic-route-loader.service.spec.ts @@ -11,9 +11,9 @@ import { loadRemoteModule, setRemoteDefinitions } from '@nx/angular/mf'; import { FallbackComponent } from '@jdw/frontend-shared-ui'; /* eslint-enable @nx/enforce-module-boundaries */ -vi.mock('@nx/angular/mf', () => ({ - loadRemoteModule: vi.fn(), - setRemoteDefinitions: vi.fn(), +jest.mock('@nx/angular/mf', () => ({ + loadRemoteModule: jest.fn(), + setRemoteDefinitions: jest.fn(), })); const mockEnvironment = { @@ -27,12 +27,12 @@ describe('DynamicRouteLoaderService', () => { beforeEach(() => { mockRouter = { - resetConfig: vi.fn(), + resetConfig: jest.fn(), config: [], } as unknown as Router; mockMfService = { - getRoutes: vi.fn().mockReturnValue(of([])), + getRoutes: jest.fn().mockReturnValue(of([])), } as unknown as MicroFrontendService; TestBed.configureTestingModule({ @@ -65,7 +65,7 @@ describe('DynamicRouteLoaderService', () => { url: 'http://example.com', }, ]; - (mockMfService.getRoutes as vi.Mock).mockReturnValue(of(routes)); + (mockMfService.getRoutes as jest.Mock).mockReturnValue(of(routes)); await service.loadRoutes(); @@ -83,8 +83,8 @@ describe('DynamicRouteLoaderService', () => { url: 'http://example.com', }, ]; - (mockMfService.getRoutes as vi.Mock).mockReturnValue(of(routes)); - (loadRemoteModule as vi.Mock).mockResolvedValue({ remoteRoutes: [] }); + (mockMfService.getRoutes as jest.Mock).mockReturnValue(of(routes)); + (loadRemoteModule as jest.Mock).mockResolvedValue({ remoteRoutes: [] }); await service.loadRoutes(); @@ -106,14 +106,15 @@ describe('DynamicRouteLoaderService', () => { url: 'http://example.com', }, ]; - (mockMfService.getRoutes as vi.Mock).mockReturnValue(of(routes)); - (loadRemoteModule as vi.Mock).mockRejectedValue( + (mockMfService.getRoutes as jest.Mock).mockReturnValue(of(routes)); + (loadRemoteModule as jest.Mock).mockRejectedValue( new Error('Failed to load remote module'), ); await service.loadRoutes(); - const configCallArgs = (mockRouter.resetConfig as vi.Mock).mock.calls[0][0]; + const configCallArgs = (mockRouter.resetConfig as jest.Mock).mock + .calls[0][0]; const exampleRoute = configCallArgs.find( (route: any) => route.path === 'example', ); diff --git a/libs/frontend/container/data-access/src/lib/micro-frontend/micro-frontend.service.spec.ts b/libs/frontend/container/data-access/src/lib/micro-frontend/micro-frontend.service.spec.ts index fbba9b686..39bf5df5b 100644 --- a/libs/frontend/container/data-access/src/lib/micro-frontend/micro-frontend.service.spec.ts +++ b/libs/frontend/container/data-access/src/lib/micro-frontend/micro-frontend.service.spec.ts @@ -11,7 +11,7 @@ import { SnackbarService } from '@jdw/frontend-shared-data-access'; import { ENVIRONMENT, getErrorMessage } from '@jdw/frontend-shared-util'; const mockSnackbarService = { - error: vi.fn(), + error: jest.fn(), }; const mockEnvironment = { @@ -39,9 +39,9 @@ const mockRoutes: MicroFrontendRoute[] = [ }, ]; -vi.mock('@jdw/frontend-shared-util', async () => ({ - ...(await vi.importActual('@jdw/frontend-shared-util')), - getErrorMessage: vi.fn(), +jest.mock('@jdw/frontend-shared-util', () => ({ + ...jest.requireActual('@jdw/frontend-shared-util'), + getErrorMessage: jest.fn(), })); describe('MicroFrontendService', () => { @@ -71,10 +71,10 @@ describe('MicroFrontendService', () => { }); describe('getRoutes', () => { - it('should make an HTTP GET request and return an array of routes', () => { - let emitted: MicroFrontendRoute[] | undefined; + it('should make an HTTP GET request and return an array of routes', (done) => { service.getRoutes().subscribe((routes) => { - emitted = routes; + expect(routes).toEqual(mockRoutes); + done(); }); const req = httpTesting.expectOne( @@ -82,42 +82,38 @@ describe('MicroFrontendService', () => { ); expect(req.request.method).toBe('GET'); req.flush(mockRoutes); - - expect(emitted).toEqual(mockRoutes); }); - it('should call handleError and return an empty array on error', () => { + it('should call handleError and return an empty array on error', (done) => { const errorResponse = new HttpErrorResponse({ error: 'Error message', status: 500, statusText: 'Server Error', url: `${mockEnvironment.SERVICE_DISCOVERY_BASE_URL}/api/micro-frontends`, }); - vi.spyOn(service, 'handleError'); + jest.spyOn(service, 'handleError'); - let emitted: MicroFrontendRoute[] | undefined; service.getRoutes().subscribe((routes) => { - emitted = routes; + expect(routes).toEqual([]); + expect(service.handleError).toHaveBeenCalledWith(errorResponse); + done(); }); const req = httpTesting.expectOne( `${mockEnvironment.SERVICE_DISCOVERY_BASE_URL}/api/micro-frontends`, ); req.flush('Error message', { status: 500, statusText: 'Server Error' }); - - expect(emitted).toEqual([]); - expect(service.handleError).toHaveBeenCalledWith(errorResponse); }); }); describe('handleError', () => { - it('should call snackbarService.error with the correct arguments and return an empty array', () => { + it('should call snackbarService.error with the correct arguments and return an empty array', (done) => { const errorResponse = new HttpErrorResponse({ error: 'Error message', status: 500, }); const mockErrorMessage = 'Mock error message'; - vi.mocked(getErrorMessage).mockReturnValue(mockErrorMessage); + (getErrorMessage as jest.Mock).mockReturnValue(mockErrorMessage); const result = service.handleError(errorResponse); @@ -128,11 +124,10 @@ describe('MicroFrontendService', () => { true, ); - let emitted: unknown[] | undefined; result.subscribe((data) => { - emitted = data; + expect(data).toEqual([]); + done(); }); - expect(emitted).toEqual([]); }); }); }); diff --git a/libs/frontend/container/data-access/src/test-setup.ts b/libs/frontend/container/data-access/src/test-setup.ts index 4f507b613..ea414013f 100644 --- a/libs/frontend/container/data-access/src/test-setup.ts +++ b/libs/frontend/container/data-access/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/container/data-access/tsconfig.lib.json b/libs/frontend/container/data-access/tsconfig.lib.json index df76464e4..912738705 100644 --- a/libs/frontend/container/data-access/tsconfig.lib.json +++ b/libs/frontend/container/data-access/tsconfig.lib.json @@ -8,10 +8,10 @@ "types": [] }, "exclude": [ - "jest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/test-setup.ts" + "src/test-setup.ts", + "jest.config.ts", + "src/**/*.test.ts" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/container/data-access/tsconfig.spec.json b/libs/frontend/container/data-access/tsconfig.spec.json index 96b61d0a2..e87905816 100644 --- a/libs/frontend/container/data-access/tsconfig.spec.json +++ b/libs/frontend/container/data-access/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/container/data-access/vite.config.ts b/libs/frontend/container/data-access/vite.config.ts deleted file mode 100644 index 4a80128b7..000000000 --- a/libs/frontend/container/data-access/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../coverage/libs/frontend/container/data-access', -); diff --git a/libs/frontend/container/feature/core/jest.config.ts b/libs/frontend/container/feature/core/jest.config.ts new file mode 100644 index 000000000..84c40d6e3 --- /dev/null +++ b/libs/frontend/container/feature/core/jest.config.ts @@ -0,0 +1,23 @@ +/* eslint-disable */ +module.exports = { + displayName: 'frontend-container-feature-core', + preset: '../../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: + '../../../../../coverage/libs/frontend/container/feature/core', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/container/feature/core/project.json b/libs/frontend/container/feature/core/project.json index df683e5fe..0b8193c4d 100644 --- a/libs/frontend/container/feature/core/project.json +++ b/libs/frontend/container/feature/core/project.json @@ -7,10 +7,10 @@ "tags": ["type:feature", "scope:container", "framework:angular"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/container/feature/core/jest.config.ts" } } } diff --git a/libs/frontend/container/feature/core/src/lib/dashboard/dashboard.component.spec.ts b/libs/frontend/container/feature/core/src/lib/dashboard/dashboard.component.spec.ts index d1db835dd..cca4187fd 100644 --- a/libs/frontend/container/feature/core/src/lib/dashboard/dashboard.component.spec.ts +++ b/libs/frontend/container/feature/core/src/lib/dashboard/dashboard.component.spec.ts @@ -1,23 +1,18 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { DashboardComponent } from './dashboard.component'; import { provideHttpClient } from '@angular/common/http'; -import { - HttpTestingController, - provideHttpClientTesting, -} from '@angular/common/http/testing'; import { ENVIRONMENT } from '@jdw/frontend-shared-util'; describe('DashboardComponent', () => { let component: DashboardComponent; let fixture: ComponentFixture; - let httpTesting: HttpTestingController; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [DashboardComponent], providers: [ provideHttpClient(), - provideHttpClientTesting(), + provideHttpClient(), { provide: ENVIRONMENT, useValue: {}, @@ -25,22 +20,12 @@ describe('DashboardComponent', () => { ], }).compileComponents(); - httpTesting = TestBed.inject(HttpTestingController); fixture = TestBed.createComponent(DashboardComponent); component = fixture.componentInstance; fixture.detectChanges(); }); - afterEach(() => { - httpTesting.verify(); - }); - it('should create', () => { expect(component).toBeTruthy(); - - // ngOnInit triggers getRoutes() via HttpClient; flush it so the request - // doesn't resolve after TestBed teardown (Vitest surfaces that as an - // uncaught NG0205 from a destroyed injector, unlike Jest). - httpTesting.expectOne(() => true).flush([]); }); }); diff --git a/libs/frontend/container/feature/core/src/test-setup.ts b/libs/frontend/container/feature/core/src/test-setup.ts index ad8bd0946..ea414013f 100644 --- a/libs/frontend/container/feature/core/src/test-setup.ts +++ b/libs/frontend/container/feature/core/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/container/feature/core/tsconfig.lib.json b/libs/frontend/container/feature/core/tsconfig.lib.json index af29cd26c..db39218de 100644 --- a/libs/frontend/container/feature/core/tsconfig.lib.json +++ b/libs/frontend/container/feature/core/tsconfig.lib.json @@ -8,16 +8,16 @@ "types": ["node"] }, "exclude": [ - "**/*.cy.js", - "**/*.cy.jsx", - "**/*.cy.ts", - "**/*.cy.tsx", - "cypress.config.ts", - "cypress/**/*", - "jest.config.ts", "src/**/*.spec.ts", + "src/test-setup.ts", + "jest.config.ts", "src/**/*.test.ts", - "src/test-setup.ts" + "cypress/**/*", + "cypress.config.ts", + "**/*.cy.ts", + "**/*.cy.js", + "**/*.cy.tsx", + "**/*.cy.jsx" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/container/feature/core/tsconfig.spec.json b/libs/frontend/container/feature/core/tsconfig.spec.json index 4e1eb0c3f..b03ed70a5 100644 --- a/libs/frontend/container/feature/core/tsconfig.spec.json +++ b/libs/frontend/container/feature/core/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/container/feature/core/vite.config.ts b/libs/frontend/container/feature/core/vite.config.ts deleted file mode 100644 index 14d0ccc71..000000000 --- a/libs/frontend/container/feature/core/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../../coverage/libs/frontend/container/feature/core', -); diff --git a/libs/frontend/container/util/jest.config.ts b/libs/frontend/container/util/jest.config.ts new file mode 100644 index 000000000..610b7a91d --- /dev/null +++ b/libs/frontend/container/util/jest.config.ts @@ -0,0 +1,21 @@ +module.exports = { + displayName: 'frontend-container-util', + preset: '../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../../coverage/libs/frontend/container/util', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/container/util/project.json b/libs/frontend/container/util/project.json index b8a52700c..492d12953 100644 --- a/libs/frontend/container/util/project.json +++ b/libs/frontend/container/util/project.json @@ -7,10 +7,10 @@ "tags": ["type:util", "scope:container", "framework:angular"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/container/util/jest.config.ts" } }, "lint": { diff --git a/libs/frontend/container/util/src/test-setup.ts b/libs/frontend/container/util/src/test-setup.ts index 4f507b613..ea414013f 100644 --- a/libs/frontend/container/util/src/test-setup.ts +++ b/libs/frontend/container/util/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/container/util/tsconfig.lib.json b/libs/frontend/container/util/tsconfig.lib.json index df76464e4..912738705 100644 --- a/libs/frontend/container/util/tsconfig.lib.json +++ b/libs/frontend/container/util/tsconfig.lib.json @@ -8,10 +8,10 @@ "types": [] }, "exclude": [ - "jest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/test-setup.ts" + "src/test-setup.ts", + "jest.config.ts", + "src/**/*.test.ts" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/container/util/tsconfig.spec.json b/libs/frontend/container/util/tsconfig.spec.json index 25eb58c54..5b038e05c 100644 --- a/libs/frontend/container/util/tsconfig.spec.json +++ b/libs/frontend/container/util/tsconfig.spec.json @@ -2,11 +2,10 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "../../../../dist/out-tsc", - "module": "preserve", + "module": "commonjs", "target": "es2016", - "types": ["vitest/globals", "node"], - "isolatedModules": true, - "moduleResolution": "bundler" + "types": ["jest", "node"], + "isolatedModules": true }, "files": ["src/test-setup.ts"], "include": [ diff --git a/libs/frontend/container/util/vite.config.ts b/libs/frontend/container/util/vite.config.ts deleted file mode 100644 index ce5edf73a..000000000 --- a/libs/frontend/container/util/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../coverage/libs/frontend/container/util', -); diff --git a/libs/frontend/rolesui/feature/core/jest.config.ts b/libs/frontend/rolesui/feature/core/jest.config.ts new file mode 100644 index 000000000..5b475b497 --- /dev/null +++ b/libs/frontend/rolesui/feature/core/jest.config.ts @@ -0,0 +1,22 @@ +module.exports = { + displayName: 'frontend-rolesui-feature-core', + preset: '../../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: + '../../../../../coverage/libs/frontend/rolesui/feature/core', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/rolesui/feature/core/project.json b/libs/frontend/rolesui/feature/core/project.json index 77cd44ee7..3b7b4796e 100644 --- a/libs/frontend/rolesui/feature/core/project.json +++ b/libs/frontend/rolesui/feature/core/project.json @@ -12,10 +12,10 @@ ], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/rolesui/feature/core/jest.config.ts" } }, "lint": { diff --git a/libs/frontend/rolesui/feature/core/src/lib/roles/roles.component.spec.ts b/libs/frontend/rolesui/feature/core/src/lib/roles/roles.component.spec.ts index 95d9f4854..9fbdbb008 100644 --- a/libs/frontend/rolesui/feature/core/src/lib/roles/roles.component.spec.ts +++ b/libs/frontend/rolesui/feature/core/src/lib/roles/roles.component.spec.ts @@ -50,7 +50,7 @@ describe('RolesComponent', () => { { provide: RolesService, useValue: { - getRoles: vi.fn(() => of(mockRoles)), + getRoles: jest.fn(() => of(mockRoles)), }, }, ], diff --git a/libs/frontend/rolesui/feature/core/src/test-setup.ts b/libs/frontend/rolesui/feature/core/src/test-setup.ts index ad8bd0946..ea414013f 100644 --- a/libs/frontend/rolesui/feature/core/src/test-setup.ts +++ b/libs/frontend/rolesui/feature/core/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/rolesui/feature/core/tsconfig.lib.json b/libs/frontend/rolesui/feature/core/tsconfig.lib.json index 3fbebaa7f..7ac1edba1 100644 --- a/libs/frontend/rolesui/feature/core/tsconfig.lib.json +++ b/libs/frontend/rolesui/feature/core/tsconfig.lib.json @@ -8,16 +8,16 @@ "types": [] }, "exclude": [ - "**/*.cy.js", - "**/*.cy.jsx", - "**/*.cy.ts", - "**/*.cy.tsx", - "cypress.config.ts", - "cypress/**/*", - "jest.config.ts", "src/**/*.spec.ts", + "src/test-setup.ts", + "jest.config.ts", "src/**/*.test.ts", - "src/test-setup.ts" + "cypress/**/*", + "cypress.config.ts", + "**/*.cy.ts", + "**/*.cy.js", + "**/*.cy.tsx", + "**/*.cy.jsx" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/rolesui/feature/core/tsconfig.spec.json b/libs/frontend/rolesui/feature/core/tsconfig.spec.json index 4e1eb0c3f..b03ed70a5 100644 --- a/libs/frontend/rolesui/feature/core/tsconfig.spec.json +++ b/libs/frontend/rolesui/feature/core/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/rolesui/feature/core/vite.config.ts b/libs/frontend/rolesui/feature/core/vite.config.ts deleted file mode 100644 index 829dec943..000000000 --- a/libs/frontend/rolesui/feature/core/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../../coverage/libs/frontend/rolesui/feature/core', -); diff --git a/libs/frontend/rolesui/util/jest.config.ts b/libs/frontend/rolesui/util/jest.config.ts new file mode 100644 index 000000000..0ba8e4467 --- /dev/null +++ b/libs/frontend/rolesui/util/jest.config.ts @@ -0,0 +1,21 @@ +module.exports = { + displayName: 'frontend-rolesui-util', + preset: '../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../../coverage/libs/frontend/rolesui/util', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/rolesui/util/project.json b/libs/frontend/rolesui/util/project.json index 13a7814ec..91b34f5f1 100644 --- a/libs/frontend/rolesui/util/project.json +++ b/libs/frontend/rolesui/util/project.json @@ -7,10 +7,10 @@ "tags": ["type:util", "scope:rolesui", "framework:angular", "library:util"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/rolesui/util/jest.config.ts" } }, "lint": { diff --git a/libs/frontend/rolesui/util/src/test-setup.ts b/libs/frontend/rolesui/util/src/test-setup.ts index 4f507b613..ea414013f 100644 --- a/libs/frontend/rolesui/util/src/test-setup.ts +++ b/libs/frontend/rolesui/util/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/rolesui/util/tsconfig.lib.json b/libs/frontend/rolesui/util/tsconfig.lib.json index df76464e4..912738705 100644 --- a/libs/frontend/rolesui/util/tsconfig.lib.json +++ b/libs/frontend/rolesui/util/tsconfig.lib.json @@ -8,10 +8,10 @@ "types": [] }, "exclude": [ - "jest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/test-setup.ts" + "src/test-setup.ts", + "jest.config.ts", + "src/**/*.test.ts" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/rolesui/util/tsconfig.spec.json b/libs/frontend/rolesui/util/tsconfig.spec.json index 25eb58c54..5b038e05c 100644 --- a/libs/frontend/rolesui/util/tsconfig.spec.json +++ b/libs/frontend/rolesui/util/tsconfig.spec.json @@ -2,11 +2,10 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "../../../../dist/out-tsc", - "module": "preserve", + "module": "commonjs", "target": "es2016", - "types": ["vitest/globals", "node"], - "isolatedModules": true, - "moduleResolution": "bundler" + "types": ["jest", "node"], + "isolatedModules": true }, "files": ["src/test-setup.ts"], "include": [ diff --git a/libs/frontend/rolesui/util/vite.config.ts b/libs/frontend/rolesui/util/vite.config.ts deleted file mode 100644 index 2e379e9df..000000000 --- a/libs/frontend/rolesui/util/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../coverage/libs/frontend/rolesui/util', -); diff --git a/libs/frontend/shared/data-access/README.md b/libs/frontend/shared/data-access/README.md index c43f354e6..a6e1c3dbe 100644 --- a/libs/frontend/shared/data-access/README.md +++ b/libs/frontend/shared/data-access/README.md @@ -90,7 +90,7 @@ class Example { login() { this.authService.login('user', 'pass').subscribe({ next: () => this.snackbar.success('Login successful'), - error: () => this.snackbar.error('Login failed'), + error: () => this.snackbar.error('Login failed') }); } } diff --git a/libs/frontend/shared/data-access/jest.config.ts b/libs/frontend/shared/data-access/jest.config.ts new file mode 100644 index 000000000..6d8658091 --- /dev/null +++ b/libs/frontend/shared/data-access/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +module.exports = { + displayName: 'data-access', + preset: '../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../../coverage/libs/frontend/shared/data-access', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/shared/data-access/project.json b/libs/frontend/shared/data-access/project.json index d4072e66c..328e72748 100644 --- a/libs/frontend/shared/data-access/project.json +++ b/libs/frontend/shared/data-access/project.json @@ -7,10 +7,10 @@ "tags": ["type:data-access", "scope:shared", "framework:angular"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/shared/data-access/jest.config.ts" } }, "lint": { diff --git a/libs/frontend/shared/data-access/src/lib/auth/auth.service.spec.ts b/libs/frontend/shared/data-access/src/lib/auth/auth.service.spec.ts index df45903c4..cd4197511 100644 --- a/libs/frontend/shared/data-access/src/lib/auth/auth.service.spec.ts +++ b/libs/frontend/shared/data-access/src/lib/auth/auth.service.spec.ts @@ -15,13 +15,13 @@ import { CookieService } from 'ngx-cookie-service'; import { SnackbarService } from '../snackbar/snackbar.service'; const mockSnackbarService = { - success: vi.fn(), - error: vi.fn(), + success: jest.fn(), + error: jest.fn(), }; const mockCookieService = { - get: vi.fn(), - set: vi.fn(), + get: jest.fn(), + set: jest.fn(), }; const environmentMock = { AUTH_BASE_URL: 'http://localhost:8080', diff --git a/libs/frontend/shared/data-access/src/lib/roles/roles.service.spec.ts b/libs/frontend/shared/data-access/src/lib/roles/roles.service.spec.ts index bcb2dec69..cab84796f 100644 --- a/libs/frontend/shared/data-access/src/lib/roles/roles.service.spec.ts +++ b/libs/frontend/shared/data-access/src/lib/roles/roles.service.spec.ts @@ -12,12 +12,12 @@ import { AuthService } from '../auth/auth.service'; import { SnackbarService } from '../snackbar/snackbar.service'; const mockAuthService = { - getToken: vi.fn(), + getToken: jest.fn(), }; const mockSnackbarService = { - error: vi.fn(), - success: vi.fn(), + error: jest.fn(), + success: jest.fn(), }; const mockEnvironment = { diff --git a/libs/frontend/shared/data-access/src/lib/snackbar/snackbar.service.spec.ts b/libs/frontend/shared/data-access/src/lib/snackbar/snackbar.service.spec.ts index e313b66d1..fc79e007a 100644 --- a/libs/frontend/shared/data-access/src/lib/snackbar/snackbar.service.spec.ts +++ b/libs/frontend/shared/data-access/src/lib/snackbar/snackbar.service.spec.ts @@ -15,8 +15,8 @@ describe('SnackbarService', () => { let service: SnackbarService; const snackbarMock = { - openFromComponent: vi.fn(), - dismiss: vi.fn(), + openFromComponent: jest.fn(), + dismiss: jest.fn(), }; const defaultType: PaletteColors = 'primary'; const defaultMessage = 'test message'; diff --git a/libs/frontend/shared/data-access/src/lib/users/users.service.spec.ts b/libs/frontend/shared/data-access/src/lib/users/users.service.spec.ts index 7402ce117..39843d23e 100644 --- a/libs/frontend/shared/data-access/src/lib/users/users.service.spec.ts +++ b/libs/frontend/shared/data-access/src/lib/users/users.service.spec.ts @@ -17,12 +17,12 @@ import { UsersService } from './users.service'; import { SnackbarService } from '../snackbar/snackbar.service'; const mockAuthService = { - getToken: vi.fn(), + getToken: jest.fn(), }; const mockSnackbarService = { - success: vi.fn(), - error: vi.fn(), + success: jest.fn(), + error: jest.fn(), }; const environmentMock = { diff --git a/libs/frontend/shared/data-access/src/test-setup.ts b/libs/frontend/shared/data-access/src/test-setup.ts index 4f507b613..ea414013f 100644 --- a/libs/frontend/shared/data-access/src/test-setup.ts +++ b/libs/frontend/shared/data-access/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/shared/data-access/tsconfig.lib.json b/libs/frontend/shared/data-access/tsconfig.lib.json index df76464e4..912738705 100644 --- a/libs/frontend/shared/data-access/tsconfig.lib.json +++ b/libs/frontend/shared/data-access/tsconfig.lib.json @@ -8,10 +8,10 @@ "types": [] }, "exclude": [ - "jest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/test-setup.ts" + "src/test-setup.ts", + "jest.config.ts", + "src/**/*.test.ts" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/shared/data-access/tsconfig.spec.json b/libs/frontend/shared/data-access/tsconfig.spec.json index 96b61d0a2..e87905816 100644 --- a/libs/frontend/shared/data-access/tsconfig.spec.json +++ b/libs/frontend/shared/data-access/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/shared/data-access/vite.config.ts b/libs/frontend/shared/data-access/vite.config.ts deleted file mode 100644 index ddee142b6..000000000 --- a/libs/frontend/shared/data-access/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../coverage/libs/frontend/shared/data-access', -); diff --git a/libs/frontend/shared/ui/CHANGELOG.md b/libs/frontend/shared/ui/CHANGELOG.md deleted file mode 100644 index 525e6b796..000000000 --- a/libs/frontend/shared/ui/CHANGELOG.md +++ /dev/null @@ -1,15 +0,0 @@ -# 1.0.0 (2026-07-10) - -### 🩹 Fixes - -- **structure:** fix stale paths missed during role-based restructure ([a012da32](https://github.com/jdwlabs/apps/commit/a012da32)) -- **build:** remove stale cypress tsconfig references from frontend libs ([cf6e6445](https://github.com/jdwlabs/apps/commit/cf6e6445)) - -### 🧱 Updated Dependencies - -- Updated frontend-shared-util to 1.0.0 - -### ❤️ Thank You - -- Claude Sonnet 4.6 -- Jake Willmsen @jdwillmsen diff --git a/libs/frontend/shared/ui/README.md b/libs/frontend/shared/ui/README.md index 792b6be7f..686fd969a 100644 --- a/libs/frontend/shared/ui/README.md +++ b/libs/frontend/shared/ui/README.md @@ -15,8 +15,8 @@ and micro frontends. - **Version:** `0.0.1` - **Type:** Angular Library (UI Components) - **Dependencies:** - - `@angular/material` - - `@jdw/angular-shared-util` + - `@angular/material` + - `@jdw/angular-shared-util` --- @@ -80,6 +80,7 @@ import { NavigationLayoutComponent } from '@jdw/angular-shared-ui'; ### Sample Component Usage ```html + /src/test-setup.ts'], + coverageDirectory: '../../../../coverage/libs/frontend/shared/ui', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/shared/ui/package.json b/libs/frontend/shared/ui/package.json index 159785abf..bd382969a 100644 --- a/libs/frontend/shared/ui/package.json +++ b/libs/frontend/shared/ui/package.json @@ -1,12 +1,12 @@ { "name": "@jdw/frontend-shared-ui", - "version": "1.0.0", + "version": "0.0.1", "peerDependencies": { "@angular/common": "^21.2.9", "@angular/core": "^21.2.9", "@angular/material": "^21.2.9", "@angular/router": "^21.2.9", - "@jdw/frontend-shared-util": "1.0.0" + "@jdw/frontend-shared-util": "0.0.1" }, "dependencies": {}, "sideEffects": false diff --git a/libs/frontend/shared/ui/project.json b/libs/frontend/shared/ui/project.json index 847395f93..9a51a66cd 100644 --- a/libs/frontend/shared/ui/project.json +++ b/libs/frontend/shared/ui/project.json @@ -22,10 +22,10 @@ "defaultConfiguration": "production" }, "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/shared/ui/jest.config.ts" } } } diff --git a/libs/frontend/shared/ui/src/lib/confirmation-dialog/confirmation-dialog.component.spec.ts b/libs/frontend/shared/ui/src/lib/confirmation-dialog/confirmation-dialog.component.spec.ts index 77d2eb114..386c74bf0 100644 --- a/libs/frontend/shared/ui/src/lib/confirmation-dialog/confirmation-dialog.component.spec.ts +++ b/libs/frontend/shared/ui/src/lib/confirmation-dialog/confirmation-dialog.component.spec.ts @@ -12,7 +12,7 @@ const mockData: ConfirmationDialogData = { }; const mockDialogRef = { - close: vi.fn(), + close: jest.fn(), }; describe('ConfirmationDialogComponent', () => { diff --git a/libs/frontend/shared/ui/src/lib/navigation-item/_navigation-item-theme.component.scss b/libs/frontend/shared/ui/src/lib/navigation-item/_navigation-item-theme.component.scss index e8f79b7e9..9933fcc74 100644 --- a/libs/frontend/shared/ui/src/lib/navigation-item/_navigation-item-theme.component.scss +++ b/libs/frontend/shared/ui/src/lib/navigation-item/_navigation-item-theme.component.scss @@ -1,72 +1,28 @@ -@use 'sass:map'; -@use '@angular/material' as mat; - -@mixin color($theme) { - $color-config: mat.m2-get-color-config($theme); - $accent-palette: map.get($color-config, 'accent'); - $is-dark-theme: map.get($color-config, 'is-dark'); - $light-color: mat.m2-get-color-from-palette($accent-palette, 500); - $dark-color: mat.m2-get-color-from-palette($accent-palette, 400); - $dark-icon: black; - $light-icon: white; - +// The pre-M3 light/dark branches collapse into system tokens: on-surface +// adapts the icon color, surface-container replaces the hard-coded hover +// backgrounds, and tertiary replaces the M2 accent palette for active items. +@mixin theme() { .nav { .icon { - @if $is-dark-theme { - color: $light-icon !important; - } @else { - color: $dark-icon !important; - } + color: var(--mat-sys-on-surface) !important; } &.active { - @if $is-dark-theme { - border-left: 3px solid $dark-color; - background-color: color-mix(in srgb, $dark-color 20%, transparent); - } @else { - border-left: 3px solid $light-color; - background-color: color-mix(in srgb, $light-color 20%, transparent); - } + border-left: 3px solid var(--mat-sys-tertiary); + background-color: color-mix( + in srgb, + var(--mat-sys-tertiary) 20%, + transparent + ); .icon { - @if $is-dark-theme { - color: $dark-color !important; - } @else { - color: $light-color !important; - } + color: var(--mat-sys-tertiary) !important; } } &:hover { - @if $is-dark-theme { - background-color: #303030; - } @else { - background-color: white; - } - - @if $is-dark-theme { - color: $light-icon !important; - } @else { - color: $dark-icon !important; - } + background-color: var(--mat-sys-surface-container); + color: var(--mat-sys-on-surface) !important; } } } - -@mixin typography($theme) { - $typography-config: mat.m2-get-typography-config($theme); -} - -@mixin theme($theme) { - $color-config: mat.m2-get-color-config($theme); - - @if $color-config != null { - @include color($theme); - } - - $typography-config: mat.m2-get-typography-config($theme); - - @if $typography-config != null { - @include typography($theme); - } -} diff --git a/libs/frontend/shared/ui/src/lib/snackbar/_snackbar-theme.component.scss b/libs/frontend/shared/ui/src/lib/snackbar/_snackbar-theme.component.scss index 34310b0bb..f4ba0921f 100644 --- a/libs/frontend/shared/ui/src/lib/snackbar/_snackbar-theme.component.scss +++ b/libs/frontend/shared/ui/src/lib/snackbar/_snackbar-theme.component.scss @@ -1,57 +1,25 @@ -@use 'sass:map'; -@use '@angular/material' as mat; - -@mixin color($theme) { - $color-config: mat.m2-get-color-config($theme); - $primary-palette: map.get($color-config, 'primary'); - $accent-palette: map.get($color-config, 'accent'); - $warn-palette: map.get($theme, 'warn'); - $error-palette: map.get($theme, 'error'); - $success-palette: map.get($theme, 'success'); - $info-palette: map.get($theme, 'info'); - - $primary-color: mat.m2-get-color-from-palette($primary-palette, default); - $accent-color: mat.m2-get-color-from-palette($accent-palette, default); - $warn-color: mat.m2-get-color-from-palette($warn-palette, default); - $error-color: mat.m2-get-color-from-palette($error-palette, default); - $success-color: mat.m2-get-color-from-palette($success-palette, default); - $info-color: mat.m2-get-color-from-palette($info-palette, default); - - $primary-color-contrast: mat.m2-get-color-from-palette( - $primary-palette, - default-contrast - ); - $accent-color-contrast: mat.m2-get-color-from-palette( - $accent-palette, - default-contrast +// M2 `accent` maps to the M3 tertiary role; `warn` keeps its pre-migration +// meaning of a cautionary orange (distinct from `error`), so it reads the +// custom semantic tokens rather than `--mat-sys-error`. +@mixin theme() { + @include _variant( + 'primary', + var(--mat-sys-primary), + var(--mat-sys-on-primary) ); - $warn-color-contrast: mat.m2-get-color-from-palette( - $warn-palette, - default-contrast + @include _variant( + 'accent', + var(--mat-sys-tertiary), + var(--mat-sys-on-tertiary) ); - $error-color-contrast: mat.m2-get-color-from-palette( - $error-palette, - default-contrast + @include _variant('warn', var(--jdw-sys-warn), var(--jdw-sys-on-warn)); + @include _variant('error', var(--mat-sys-error), var(--mat-sys-on-error)); + @include _variant( + 'success', + var(--jdw-sys-success), + var(--jdw-sys-on-success) ); - $success-color-contrast: mat.m2-get-color-from-palette( - $success-palette, - default-contrast - ); - $info-color-contrast: mat.m2-get-color-from-palette( - $info-palette, - default-contrast - ); - - @include _variant('primary', $primary-color, $primary-color-contrast); - @include _variant('accent', $accent-color, $accent-color-contrast); - @include _variant('warn', $warn-color, $warn-color-contrast); - @include _variant('error', $error-color, $error-color-contrast); - @include _variant('success', $success-color, $success-color-contrast); - @include _variant('info', $info-color, $info-color-contrast); -} - -@mixin typography($theme) { - $typography-config: mat.m2-get-typography-config($theme); + @include _variant('info', var(--jdw-sys-info), var(--jdw-sys-on-info)); .mat-mdc-snack-bar-container { .mat-mdc-snack-bar-label.mdc-snackbar__label { @@ -72,20 +40,6 @@ } } -@mixin theme($theme) { - $color-config: mat.m2-get-color-config($theme); - - @if $color-config != null { - @include color($theme); - } - - $typography-config: mat.m2-get-typography-config($theme); - - @if $typography-config != null { - @include typography($theme); - } -} - @mixin _variant($type, $color, $color-contrast) { .#{$type}.mat-mdc-snack-bar-container { .mdc-snackbar__surface { @@ -110,7 +64,7 @@ border-radius: 4px; .mdc-snackbar__surface { - --mat-snackbar-container-color: #{transparent}; + --mat-snackbar-container-color: transparent; --mat-snackbar-supporting-text-color: #{$color}; } } diff --git a/libs/frontend/shared/ui/src/lib/styles/_all-themes.scss b/libs/frontend/shared/ui/src/lib/styles/_all-themes.scss index c3dbac98a..cf2ad0328 100644 --- a/libs/frontend/shared/ui/src/lib/styles/_all-themes.scss +++ b/libs/frontend/shared/ui/src/lib/styles/_all-themes.scss @@ -1,13 +1,15 @@ -@use '@angular/material' as mat; @use './components/button/variants' as button-variants; @use './components/ag-grid/ag-grid-theme.component' as ag-grid; @use '../navigation-item/navigation-item-theme.component' as navigation-item; @use '../snackbar/snackbar-theme.component' as snackbar; -@mixin all-component-themes($theme) { - @include button-variants.theme($theme); - @include ag-grid.theme($theme); - @include navigation-item.theme($theme); - @include snackbar.theme($theme); - @include mat.all-component-themes($theme); +// Material component styles flow through the `--mat-sys-*` tokens emitted by +// `mat.theme()`, so only the app-specific component styles are included here. +// `$dark` is still needed because ag-grid selects a whole different prebuilt +// theme rather than reading CSS custom properties. +@mixin all-component-themes($dark: false) { + @include button-variants.theme(); + @include ag-grid.theme($dark); + @include navigation-item.theme(); + @include snackbar.theme(); } diff --git a/libs/frontend/shared/ui/src/lib/styles/_palette.scss b/libs/frontend/shared/ui/src/lib/styles/_palette.scss deleted file mode 100644 index 0d5bcd148..000000000 --- a/libs/frontend/shared/ui/src/lib/styles/_palette.scss +++ /dev/null @@ -1,332 +0,0 @@ -$dark-text: rgba(black, 0.87); -$light-text: white; - -$red-palette: ( - 50: #ffe7e6, - 100: #ffc7b8, - 200: #ffa28a, - 300: #ff795b, - 400: #ff5436, - 500: #ff200c, - 600: #ff1507, - 700: #ff0000, - 800: #f10000, - 900: #da0000, - A100: #ff8a80, - A200: #ff5252, - A400: #ff1744, - A700: #d50000, - contrast: ( - 50: $dark-text, - 100: $dark-text, - 200: $dark-text, - 300: $dark-text, - 400: $dark-text, - 500: $light-text, - 600: $light-text, - 700: $light-text, - 800: $light-text, - 900: $light-text, - A100: $dark-text, - A200: $light-text, - A400: $light-text, - A700: $light-text, - ), -); - -$teal-palette: ( - 50: #d9fffe, - 100: #9afffd, - 200: #00ffff, - 300: #00fbff, - 400: #00f5fe, - 500: #00f0ff, - 600: #00deeb, - 700: #00c7ce, - 800: #00b1b4, - 900: #008c82, - A100: #a7ffeb, - A200: #64ffda, - A400: #1de9b6, - A700: #00bfa5, - contrast: ( - 50: $dark-text, - 100: $dark-text, - 200: $dark-text, - 300: $dark-text, - 400: $dark-text, - 500: $light-text, - 600: $light-text, - 700: $light-text, - 800: $light-text, - 900: $light-text, - A100: $dark-text, - A200: $dark-text, - A400: $dark-text, - A700: $dark-text, - ), -); - -$black-palette: ( - 50: #f5f5f5, - 100: #e9e9e9, - 200: #d9d9d9, - 300: #c4c4c4, - 400: #9d9d9d, - 500: #7b7b7b, - 600: #555555, - 700: #434343, - 800: #262626, - 900: #000000, - A100: #7a7a7a, - A200: #5c5c5c, - A400: #4f4f4f, - A700: #474747, - contrast: ( - 50: $dark-text, - 100: $dark-text, - 200: $dark-text, - 300: $dark-text, - 400: $dark-text, - 500: $light-text, - 600: $light-text, - 700: $light-text, - 800: $light-text, - 900: $light-text, - A100: $light-text, - A200: $light-text, - A400: $light-text, - A700: $light-text, - ), -); - -$white-palette: ( - 50: #ffffff, - 100: #fafafa, - 200: #f5f5f5, - 300: #f0f0f0, - 400: #dedede, - 500: #c2c2c2, - 600: #979797, - 700: #818181, - 800: #606060, - 900: #3c3c3c, - A100: #7a7a7a, - A200: #5c5c5c, - A400: #4f4f4f, - A700: #474747, - contrast: ( - 50: $dark-text, - 100: $dark-text, - 200: $dark-text, - 300: $dark-text, - 400: $dark-text, - 500: $light-text, - 600: $light-text, - 700: $light-text, - 800: $light-text, - 900: $light-text, - A100: $light-text, - A200: $light-text, - A400: $light-text, - A700: $light-text, - ), -); - -$primary-palette: ( - 50: var(--primary-50, #f0fae7), - 100: var(--primary-100, #daf1c4), - 200: var(--primary-200, #c1e89d), - 300: var(--primary-300, #a7de73), - 400: var(--primary-400, #91d750), - 500: var(--primary-500, #7dcf2a), - 600: var(--primary-600, #6dbf22), - 700: var(--primary-700, #56aa16), - 800: var(--primary-800, #3f9607), - 900: var(--primary-900, #007400), - A100: var(--primary-A100, #cbf2c4), - A200: var(--primary-A200, #a7e99d), - A400: var(--primary-A400, #5bd750), - A700: var(--primary-A700, #00aa16), - contrast: ( - 50: var(--primary-contrast-50, $dark-text), - 100: var(--primary-contrast-100, $dark-text), - 200: var(--primary-contrast-200, $dark-text), - 300: var(--primary-contrast-300, $dark-text), - 400: var(--primary-contrast-400, $dark-text), - 500: var(--primary-contrast-500, $light-text), - 600: var(--primary-contrast-600, $light-text), - 700: var(--primary-contrast-700, $light-text), - 800: var(--primary-contrast-800, $light-text), - 900: var(--primary-contrast-900, $light-text), - A100: var(--primary-contrast-A100, $dark-text), - A200: var(--primary-contrast-A200, $dark-text), - A400: var(--primary-contrast-A400, $light-text), - A700: var(--primary-contrast-A700, $light-text), - ), -); - -$accent-palette: ( - 50: var(--accent-50, #ffe1fc), - 100: var(--accent-100, #ffb4f6), - 200: var(--accent-200, #ff79f2), - 300: var(--accent-300, #ff00ed), - 400: var(--accent-400, #fc00e8), - 500: var(--accent-500, #ed00db), - 600: var(--accent-600, #dc00d8), - 700: var(--accent-700, #c400d5), - 800: var(--accent-800, #ae00d1), - 900: var(--accent-900, #8400c9), - A100: var(--accent-A100, #e0c4ff), - A200: var(--accent-A200, #cc9cff), - A400: var(--accent-A400, #a447ff), - A700: var(--accent-A700, #7400f0), - contrast: ( - 50: var(--accent-contrast-50, $dark-text), - 100: var(--accent-contrast-100, $dark-text), - 200: var(--accent-contrast-200, $dark-text), - 300: var(--accent-contrast-300, $dark-text), - 400: var(--accent-contrast-400, $dark-text), - 500: var(--accent-contrast-500, $light-text), - 600: var(--accent-contrast-600, $light-text), - 700: var(--accent-contrast-700, $light-text), - 800: var(--accent-contrast-800, $light-text), - 900: var(--accent-contrast-900, $light-text), - A100: var(--accent-contrast-A100, $dark-text), - A200: var(--accent-contrast-A200, $dark-text), - A400: var(--accent-contrast-A400, $light-text), - A700: var(--accent-contrast-A700, $light-text), - ), -); - -$warn-palette: ( - 50: var(--warn-50, #fff3e0), - 100: var(--warn-100, #ffe0b2), - 200: var(--warn-200, #ffcc80), - 300: var(--warn-300, #ffb74d), - 400: var(--warn-400, #ffa726), - 500: var(--warn-500, #ff9800), - 600: var(--warn-600, #fb8c00), - 700: var(--warn-700, #f57c00), - 800: var(--warn-800, #ef6c00), - 900: var(--warn-900, #e65100), - A100: var(--warn-A100, #ffd180), - A200: var(--warn-A200, #ffab40), - A400: var(--warn-A400, #ff9100), - A700: var(--warn-A700, #ff6d00), - contrast: ( - 50: var(--warn-contrast-50, $dark-text), - 100: var(--warn-contrast-100, $dark-text), - 200: var(--warn-contrast-200, $dark-text), - 300: var(--warn-contrast-300, $dark-text), - 400: var(--warn-contrast-400, $dark-text), - 500: var(--warn-contrast-500, $light-text), - 600: var(--warn-contrast-600, $light-text), - 700: var(--warn-contrast-700, $light-text), - 800: var(--warn-contrast-800, $light-text), - 900: var(--warn-contrast-900, $light-text), - A100: var(--warn-contrast-A100, $dark-text), - A200: var(--warn-contrast-A200, $dark-text), - A400: var(--warn-contrast-A400, $light-text), - A700: var(--warn-contrast-A700, $light-text), - ), -); - -$success-palette: ( - 50: var(--success-50, #e8f5e9), - 100: var(--success-100, #c8e6c9), - 200: var(--success-200, #a5d6a7), - 300: var(--success-300, #81c784), - 400: var(--success-400, #66bb6a), - 500: var(--success-500, #4caf50), - 600: var(--success-600, #43a047), - 700: var(--success-700, #388e3c), - 800: var(--success-800, #2e7d32), - 900: var(--success-900, #1b5e20), - A100: var(--success-A100, #b9f6ca), - A200: var(--success-A200, #69f0ae), - A400: var(--success-A400, #00e676), - A700: var(--success-A700, #00c853), - contrast: ( - 50: var(--success-contrast-50, $dark-text), - 100: var(--success-contrast-100, $dark-text), - 200: var(--success-contrast-200, $dark-text), - 300: var(--success-contrast-300, $dark-text), - 400: var(--success-contrast-400, $dark-text), - 500: var(--success-contrast-500, $light-text), - 600: var(--success-contrast-600, $light-text), - 700: var(--success-contrast-700, $light-text), - 800: var(--success-contrast-800, $light-text), - 900: var(--success-contrast-900, $light-text), - A100: var(--success-contrast-A100, $dark-text), - A200: var(--success-contrast-A200, $dark-text), - A400: var(--success-contrast-A400, $light-text), - A700: var(--success-contrast-A700, $light-text), - ), -); - -$error-palette: ( - 50: var(--error-50, #ffebee), - 100: var(--error-100, #ffcdd2), - 200: var(--error-200, #ef9a9a), - 300: var(--error-300, #e57373), - 400: var(--error-400, #ef5350), - 500: var(--error-500, #f44336), - 600: var(--error-600, #e53935), - 700: var(--error-700, #d32f2f), - 800: var(--error-800, #c62828), - 900: var(--error-900, #b71c1c), - A100: var(--error-A100, #ff8a80), - A200: var(--error-A200, #ff5252), - A400: var(--error-A400, #ff1744), - A700: var(--error-A700, #d50000), - contrast: ( - 50: var(--error-contrast-50, $dark-text), - 100: var(--error-contrast-100, $dark-text), - 200: var(--error-contrast-200, $dark-text), - 300: var(--error-contrast-300, $dark-text), - 400: var(--error-contrast-400, $dark-text), - 500: var(--error-contrast-500, $light-text), - 600: var(--error-contrast-600, $light-text), - 700: var(--error-contrast-700, $light-text), - 800: var(--error-contrast-800, $light-text), - 900: var(--error-contrast-900, $light-text), - A100: var(--error-contrast-A100, $dark-text), - A200: var(--error-contrast-A200, $dark-text), - A400: var(--error-contrast-A400, $light-text), - A700: var(--error-contrast-A700, $light-text), - ), -); - -$info-palette: ( - 50: var(--info-50, #e3f2fd), - 100: var(--info-100, #bbdefb), - 200: var(--info-200, #90caf9), - 300: var(--info-300, #64b5f6), - 400: var(--info-400, #42a5f5), - 500: var(--info-500, #2196f3), - 600: var(--info-600, #1e88e5), - 700: var(--info-700, #1976d2), - 800: var(--info-800, #1565c0), - 900: var(--info-900, #0d47a1), - A100: var(--info-A100, #82b1ff), - A200: var(--info-A200, #448aff), - A400: var(--info-A400, #2979ff), - A700: var(--info-A700, #2962ff), - contrast: ( - 50: var(--info-contrast-50, $dark-text), - 100: var(--info-contrast-100, $dark-text), - 200: var(--info-contrast-200, $dark-text), - 300: var(--info-contrast-300, $dark-text), - 400: var(--info-contrast-400, $dark-text), - 500: var(--info-contrast-500, $light-text), - 600: var(--info-contrast-600, $light-text), - 700: var(--info-contrast-700, $light-text), - 800: var(--info-contrast-800, $light-text), - 900: var(--info-contrast-900, $light-text), - A100: var(--info-contrast-A100, $dark-text), - A200: var(--info-contrast-A200, $dark-text), - A400: var(--info-contrast-A400, $light-text), - A700: var(--info-contrast-A700, $light-text), - ), -); diff --git a/libs/frontend/shared/ui/src/lib/styles/_theming.scss b/libs/frontend/shared/ui/src/lib/styles/_theming.scss index f02404748..2657a6838 100644 --- a/libs/frontend/shared/ui/src/lib/styles/_theming.scss +++ b/libs/frontend/shared/ui/src/lib/styles/_theming.scss @@ -1,94 +1,33 @@ +@use 'sass:map'; @use '@angular/material' as mat; -/// Defines a theme with success, error, warn, and info colors. -/// @param {Map} $primary The primary color palette. -/// @param {Map} $accent The accent color palette. -/// @param {Map} $warn The warn color palette. -/// @param {Map} $success The success color palette. -/// @param {Map} $error The error color palette. -/// @param {Map} $info The info color palette. -/// @param {Boolean} $create-light-theme If true a light theme is created, otherwise a dark theme is created -/// @param {Boolean} $typography The typography config -/// @param {Boolean} $density The density config -@function define-theme( - $primary, - $accent, - $warn: mat.$m2-orange-palette, - $success: mat.$m2-green-palette, - $error: mat.$m2-red-palette, - $info: mat.$m2-blue-palette, - $create-light-theme: true, - $typography: mat.m2-define-typography-config(), - $density: 0 -) { - $theme: null; +// Defaults match the M2 green/blue/orange 500 hues the apps used before the +// M3 migration so existing success/info/warn surfaces keep their colors. +$_default-semantic-colors: ( + success: #4caf50, + on-success: white, + info: #2196f3, + on-info: white, + warn: #ff9800, + on-warn: rgba(black, 0.87), +); - @if ($create-light-theme) { - $color-config: ( - primary: $primary, - accent: $accent, - warn: $error, - ); - $theme: mat.m2-define-light-theme( - ( - color: $color-config, - typography: $typography, - density: $density, - ) - ); - } @else { - $color-config: ( - primary: $primary, - accent: $accent, - warn: $error, - ); - $theme: mat.m2-define-dark-theme( - ( - color: $color-config, - typography: $typography, - density: $density, - ) - ); - } +/// Emits the Material M3 system tokens plus the app's extra semantic color +/// tokens. M3 only defines primary/secondary/tertiary/error color roles, so +/// success, info, and warn are published as `--jdw-sys-*` custom properties +/// alongside the `--mat-sys-*` tokens. +/// @param {Map} $config `mat.theme()` configuration (color/typography/density). +/// @param {Map} $semantic-colors Optional overrides for the semantic colors: +/// success, on-success, info, on-info, warn, on-warn. +@mixin theme($config, $semantic-colors: ()) { + $colors: map.merge($_default-semantic-colors, $semantic-colors); - $extra: ( - success: $success, - error: $error, - info: $info, - warn: $warn, - ); - @return map-merge($theme, $extra); -} - -@function define-palette( - $base-palette, - $default: 500, - $lighter: 100, - $darker: 700, - $extra-light: 50, - $extra-dark: 900, - $text: $default -) { - $new-palette: mat.m2-define-palette( - $base-palette, - $default, - $lighter, - $darker, - $text: $default - ); - - $extra-palette: ( - extra-light: map-get($base-palette, $extra-light), - extra-dark: map-get($base-palette, $extra-dark), - extra-light-contrast: mat.m2-get-contrast-color-from-palette( - $base-palette, - $extra-light - ), - extra-dark-contrast: mat.m2-get-contrast-color-from-palette( - $base-palette, - $extra-dark - ), - ); + @include mat.theme($config); - @return map-merge($new-palette, $extra-palette); + --jdw-sys-success: #{map.get($colors, success)}; + --jdw-sys-on-success: #{map.get($colors, on-success)}; + --jdw-sys-info: #{map.get($colors, info)}; + --jdw-sys-on-info: #{map.get($colors, on-info)}; + --jdw-sys-warn: #{map.get($colors, warn)}; + --jdw-sys-on-warn: #{map.get($colors, on-warn)}; } diff --git a/libs/frontend/shared/ui/src/lib/styles/components/ag-grid/_ag-grid-theme.component.scss b/libs/frontend/shared/ui/src/lib/styles/components/ag-grid/_ag-grid-theme.component.scss index dc3583774..d89d81681 100644 --- a/libs/frontend/shared/ui/src/lib/styles/components/ag-grid/_ag-grid-theme.component.scss +++ b/libs/frontend/shared/ui/src/lib/styles/components/ag-grid/_ag-grid-theme.component.scss @@ -1,12 +1,9 @@ -@use 'sass:map'; -@use '@angular/material' as mat; @use 'node_modules/ag-grid-community/styles' as ag; -@mixin color($theme) { - $color-config: mat.m2-get-color-config($theme); - $is-dark-theme: map.get($color-config, 'is-dark'); - - @if $is-dark-theme { +// ag-grid ships separate light/dark prebuilt themes instead of reading CSS +// custom properties, so the dark variant has to be chosen at compile time. +@mixin theme($dark: false) { + @if $dark { @include ag.grid-styles( ( themes: ( @@ -28,21 +25,3 @@ ); } } - -@mixin typography($theme) { - $typography-config: mat.m2-get-typography-config($theme); -} - -@mixin theme($theme) { - $color-config: mat.m2-get-color-config($theme); - - @if $color-config != null { - @include color($theme); - } - - $typography-config: mat.m2-get-typography-config($theme); - - @if $typography-config != null { - @include typography($theme); - } -} diff --git a/libs/frontend/shared/ui/src/lib/styles/components/button/_variants.scss b/libs/frontend/shared/ui/src/lib/styles/components/button/_variants.scss index 052ddbbff..47a7a2a59 100644 --- a/libs/frontend/shared/ui/src/lib/styles/components/button/_variants.scss +++ b/libs/frontend/shared/ui/src/lib/styles/components/button/_variants.scss @@ -1,79 +1,35 @@ -@use 'sass:map'; -@use '@angular/material' as mat; - -@mixin color($theme) { - $color-config: mat.m2-get-color-config($theme); - $primary-palette: map.get($color-config, 'primary'); - $accent-palette: map.get($color-config, 'accent'); - $warn-palette: map.get($theme, 'warn'); - $error-palette: map.get($theme, 'error'); - $success-palette: map.get($theme, 'success'); - $info-palette: map.get($theme, 'info'); - - $primary-color: mat.m2-get-color-from-palette($primary-palette, default); - $accent-color: mat.m2-get-color-from-palette($accent-palette, default); - $warn-color: mat.m2-get-color-from-palette($warn-palette, default); - $error-color: mat.m2-get-color-from-palette($error-palette, default); - $success-color: mat.m2-get-color-from-palette($success-palette, default); - $info-color: mat.m2-get-color-from-palette($info-palette, default); - - $primary-color-contrast: mat.m2-get-color-from-palette( - $primary-palette, - default-contrast - ); - $accent-color-contrast: mat.m2-get-color-from-palette( - $accent-palette, - default-contrast - ); - $warn-color-contrast: mat.m2-get-color-from-palette( - $warn-palette, - default-contrast +// M2 `accent` maps to the M3 tertiary role; `warn` keeps its pre-migration +// meaning of a cautionary orange (distinct from `error`), so it reads the +// custom semantic tokens rather than `--mat-sys-error`. +@mixin theme() { + @include _variant( + 'primary', + var(--mat-sys-primary), + var(--mat-sys-on-primary) ); - $error-color-contrast: mat.m2-get-color-from-palette( - $error-palette, - default-contrast + @include _variant( + 'accent', + var(--mat-sys-tertiary), + var(--mat-sys-on-tertiary) ); - $success-color-contrast: mat.m2-get-color-from-palette( - $success-palette, - default-contrast + @include _variant('warn', var(--jdw-sys-warn), var(--jdw-sys-on-warn)); + @include _variant('error', var(--mat-sys-error), var(--mat-sys-on-error)); + @include _variant( + 'success', + var(--jdw-sys-success), + var(--jdw-sys-on-success) ); - $info-color-contrast: mat.m2-get-color-from-palette( - $info-palette, - default-contrast - ); - - @include _variant('primary', $primary-color, $primary-color-contrast); - @include _variant('accent', $accent-color, $accent-color-contrast); - @include _variant('warn', $warn-color, $warn-color-contrast); - @include _variant('error', $error-color, $error-color-contrast); - @include _variant('success', $success-color, $success-color-contrast); - @include _variant('info', $info-color, $info-color-contrast); -} - -@mixin typography($theme) { - $typography-config: mat.m2-get-typography-config($theme); -} - -@mixin theme($theme) { - $color-config: mat.m2-get-color-config($theme); - - @if $color-config != null { - @include color($theme); - } - - $typography-config: mat.m2-get-typography-config($theme); - - @if $typography-config != null { - @include typography($theme); - } + @include _variant('info', var(--jdw-sys-info), var(--jdw-sys-on-info)); } @mixin _variant($type, $color, $color-contrast) { + $ripple-color: color-mix(in srgb, $color 10%, transparent); + .mdc-button:not(:disabled).mat-#{$type}, .mat-mdc-stroked-button.mat-#{$type} { color: $color; --mat-mdc-button-persistent-ripple-color: #{$color}; - --mat-mdc-button-ripple-color: #{rgba($color, 0.1)}; + --mat-mdc-button-ripple-color: #{$ripple-color}; } .mat-mdc-unelevated-button.mat-#{$type}:hover, @@ -81,7 +37,7 @@ color: $color-contrast; background-color: $color; --mat-mdc-button-persistent-ripple-color: #{$color-contrast}; - --mat-mdc-button-ripple-color: #{rgba($color, 0.1)}; + --mat-mdc-button-ripple-color: #{$ripple-color}; } .mat-mdc-unelevated-button:not(:disabled).mat-#{$type}, @@ -92,12 +48,12 @@ color: $color-contrast; background-color: $color; --mat-mdc-button-persistent-ripple-color: #{$color-contrast}; - --mat-mdc-button-ripple-color: #{rgba($color, 0.1)}; + --mat-mdc-button-ripple-color: #{$ripple-color}; } .mat-mdc-icon-button.mat-#{$type} { color: $color; --mat-mdc-button-persistent-ripple-color: #{$color}; - --mat-mdc-button-ripple-color: #{rgba($color, 0.1)}; + --mat-mdc-button-ripple-color: #{$ripple-color}; } } diff --git a/libs/frontend/shared/ui/src/lib/styles/themes/black-white.scss b/libs/frontend/shared/ui/src/lib/styles/themes/black-white.scss index 724431fdd..dae13859d 100644 --- a/libs/frontend/shared/ui/src/lib/styles/themes/black-white.scss +++ b/libs/frontend/shared/ui/src/lib/styles/themes/black-white.scss @@ -1,26 +1,93 @@ +@use 'sass:map'; @use '@angular/material' as mat; @use '../all-themes'; @use '../theming'; -@use '../palette'; -$theme-primary: theming.define-palette(palette.$black-palette, 900); -$theme-accent: theming.define-palette(palette.$white-palette, 600); -$theme-warn: theming.define-palette(mat.$m2-yellow-palette); -$theme-success: theming.define-palette(mat.$m2-green-palette); -$theme-error: theming.define-palette(mat.$m2-red-palette); -$theme-info: theming.define-palette(mat.$m2-blue-palette); -$theme-typography: mat.m2-define-typography-config(); -$theme-density: 0; -$theme-light: true; -$theme: theming.define-theme( - $theme-primary, - $theme-accent, - $theme-warn, - $theme-success, - $theme-error, - $theme-info, - $theme-light, - $theme-typography, - $theme-density +// No built-in M3 palette is monochrome, so this theme defines its own +// grayscale palette (sRGB grays whose lightness matches each M3 tone) to +// preserve the black-and-white look of the old M2 black/white palettes. +$_grey-tones: ( + 0: #000000, + 10: #1b1b1b, + 20: #303030, + 25: #3b3b3b, + 30: #474747, + 35: #525252, + 40: #5e5e5e, + 50: #777777, + 60: #919191, + 70: #ababab, + 80: #c6c6c6, + 90: #e2e2e2, + 95: #f1f1f1, + 98: #f9f9f9, + 99: #fcfcfc, + 100: #ffffff, ); -@include all-themes.all-component-themes($theme); + +// The neutral palette needs the extra surface tones that `mat.theme()` reads +// for the surface-container token family. +$_grey-neutral-tones: map.merge( + $_grey-tones, + ( + 4: #0e0e0e, + 6: #131313, + 12: #202020, + 17: #2a2a2a, + 22: #353535, + 24: #393939, + 87: #dadada, + 92: #e8e8e8, + 94: #eeeeee, + 96: #f3f3f3, + ) +); + +// Error tones copied from the built-in M3 palettes so error surfaces stay +// red rather than gray. +$_grey-palette: map.merge( + $_grey-tones, + ( + secondary: $_grey-tones, + neutral: $_grey-neutral-tones, + neutral-variant: $_grey-tones, + error: ( + 0: #000000, + 10: #410002, + 20: #690005, + 25: #7e0007, + 30: #93000a, + 35: #a80710, + 40: #ba1a1a, + 50: #de3730, + 60: #ff5449, + 70: #ff897d, + 80: #ffb4ab, + 90: #ffdad6, + 95: #ffedea, + 98: #fff8f7, + 99: #fffbff, + 100: #ffffff, + ), + ) +); + +// Warn keeps this theme's M2 yellow instead of the shared orange default. +html { + @include theming.theme( + ( + color: ( + primary: $_grey-palette, + theme-type: light, + ), + typography: Roboto, + density: 0, + ), + ( + warn: #ffeb3b, + on-warn: rgba(black, 0.87), + ) + ); +} + +@include all-themes.all-component-themes(); diff --git a/libs/frontend/shared/ui/src/lib/styles/themes/deeppurple-amber.scss b/libs/frontend/shared/ui/src/lib/styles/themes/deeppurple-amber.scss index cc26ab488..438f0c797 100644 --- a/libs/frontend/shared/ui/src/lib/styles/themes/deeppurple-amber.scss +++ b/libs/frontend/shared/ui/src/lib/styles/themes/deeppurple-amber.scss @@ -2,24 +2,20 @@ @use '../all-themes'; @use '../theming'; -$theme-primary: theming.define-palette(mat.$m2-deep-purple-palette); -$theme-accent: theming.define-palette(mat.$m2-amber-palette, A200, A100, A400); -$theme-warn: theming.define-palette(mat.$m2-orange-palette); -$theme-success: theming.define-palette(mat.$m2-green-palette); -$theme-error: theming.define-palette(mat.$m2-red-palette); -$theme-info: theming.define-palette(mat.$m2-blue-palette); -$theme-typography: mat.m2-define-typography-config(); -$theme-density: 0; -$theme-light: true; -$theme: theming.define-theme( - $theme-primary, - $theme-accent, - $theme-warn, - $theme-success, - $theme-error, - $theme-info, - $theme-light, - $theme-typography, - $theme-density -); -@include all-themes.all-component-themes($theme); +// M2 deep-purple/amber mapped to the closest built-in M3 palettes: violet for +// the deep-purple primary, yellow for the amber accent (tertiary in M3). +html { + @include theming.theme( + ( + color: ( + primary: mat.$violet-palette, + tertiary: mat.$yellow-palette, + theme-type: light, + ), + typography: Roboto, + density: 0, + ) + ); +} + +@include all-themes.all-component-themes(); diff --git a/libs/frontend/shared/ui/src/lib/styles/themes/indigo-pink.scss b/libs/frontend/shared/ui/src/lib/styles/themes/indigo-pink.scss index e31e06043..7ca34011f 100644 --- a/libs/frontend/shared/ui/src/lib/styles/themes/indigo-pink.scss +++ b/libs/frontend/shared/ui/src/lib/styles/themes/indigo-pink.scss @@ -2,24 +2,20 @@ @use '../all-themes'; @use '../theming'; -$theme-primary: theming.define-palette(mat.$m2-indigo-palette); -$theme-accent: theming.define-palette(mat.$m2-pink-palette, A200, A100, A400); -$theme-warn: theming.define-palette(mat.$m2-orange-palette); -$theme-success: theming.define-palette(mat.$m2-green-palette); -$theme-error: theming.define-palette(mat.$m2-red-palette); -$theme-info: theming.define-palette(mat.$m2-blue-palette); -$theme-typography: mat.m2-define-typography-config(); -$theme-density: 0; -$theme-light: true; -$theme: theming.define-theme( - $theme-primary, - $theme-accent, - $theme-warn, - $theme-success, - $theme-error, - $theme-info, - $theme-light, - $theme-typography, - $theme-density -); -@include all-themes.all-component-themes($theme); +// M2 indigo/pink mapped to the closest built-in M3 palettes: azure for the +// indigo primary, rose for the pink accent (tertiary in M3). +html { + @include theming.theme( + ( + color: ( + primary: mat.$azure-palette, + tertiary: mat.$rose-palette, + theme-type: light, + ), + typography: Roboto, + density: 0, + ) + ); +} + +@include all-themes.all-component-themes(); diff --git a/libs/frontend/shared/ui/src/lib/styles/themes/pink-bluegrey.scss b/libs/frontend/shared/ui/src/lib/styles/themes/pink-bluegrey.scss index 716512968..3637bd5f2 100644 --- a/libs/frontend/shared/ui/src/lib/styles/themes/pink-bluegrey.scss +++ b/libs/frontend/shared/ui/src/lib/styles/themes/pink-bluegrey.scss @@ -2,29 +2,20 @@ @use '../all-themes'; @use '../theming'; -$theme-primary: theming.define-palette(mat.$m2-pink-palette); -$theme-accent: theming.define-palette( - mat.$m2-blue-grey-palette, - A200, - A100, - A400 -); -$theme-warn: theming.define-palette(mat.$m2-orange-palette); -$theme-success: theming.define-palette(mat.$m2-green-palette); -$theme-error: theming.define-palette(mat.$m2-red-palette); -$theme-info: theming.define-palette(mat.$m2-blue-palette); -$theme-typography: mat.m2-define-typography-config(); -$theme-density: 0; -$theme-light: false; -$theme: theming.define-theme( - $theme-primary, - $theme-accent, - $theme-warn, - $theme-success, - $theme-error, - $theme-info, - $theme-light, - $theme-typography, - $theme-density -); -@include all-themes.all-component-themes($theme); +// M2 pink/blue-grey mapped to the closest built-in M3 palettes: rose for the +// pink primary, azure for the muted blue-grey accent (tertiary in M3). +html { + @include theming.theme( + ( + color: ( + primary: mat.$rose-palette, + tertiary: mat.$azure-palette, + theme-type: dark, + ), + typography: Roboto, + density: 0, + ) + ); +} + +@include all-themes.all-component-themes($dark: true); diff --git a/libs/frontend/shared/ui/src/lib/styles/themes/purple-green.scss b/libs/frontend/shared/ui/src/lib/styles/themes/purple-green.scss index 433dc4877..b84874fc7 100644 --- a/libs/frontend/shared/ui/src/lib/styles/themes/purple-green.scss +++ b/libs/frontend/shared/ui/src/lib/styles/themes/purple-green.scss @@ -2,24 +2,20 @@ @use '../all-themes'; @use '../theming'; -$theme-primary: theming.define-palette(mat.$m2-purple-palette); -$theme-accent: theming.define-palette(mat.$m2-green-palette, A200, A100, A400); -$theme-warn: theming.define-palette(mat.$m2-orange-palette); -$theme-success: theming.define-palette(mat.$m2-green-palette); -$theme-error: theming.define-palette(mat.$m2-red-palette); -$theme-info: theming.define-palette(mat.$m2-blue-palette); -$theme-typography: mat.m2-define-typography-config(); -$theme-density: 0; -$theme-light: false; -$theme: theming.define-theme( - $theme-primary, - $theme-accent, - $theme-warn, - $theme-success, - $theme-error, - $theme-info, - $theme-light, - $theme-typography, - $theme-density -); -@include all-themes.all-component-themes($theme); +// M2 purple/green mapped to the closest built-in M3 palettes: magenta for the +// purple primary, spring-green for the green A200 accent (tertiary in M3). +html { + @include theming.theme( + ( + color: ( + primary: mat.$magenta-palette, + tertiary: mat.$spring-green-palette, + theme-type: dark, + ), + typography: Roboto, + density: 0, + ) + ); +} + +@include all-themes.all-component-themes($dark: true); diff --git a/libs/frontend/shared/ui/src/lib/styles/themes/red-teal.scss b/libs/frontend/shared/ui/src/lib/styles/themes/red-teal.scss index d5e54819a..db2fd16d8 100644 --- a/libs/frontend/shared/ui/src/lib/styles/themes/red-teal.scss +++ b/libs/frontend/shared/ui/src/lib/styles/themes/red-teal.scss @@ -1,26 +1,29 @@ @use '@angular/material' as mat; @use '../all-themes'; @use '../theming'; -@use '../palette'; -$theme-primary: theming.define-palette(palette.$red-palette, 700, 100, 900); -$theme-accent: theming.define-palette(palette.$teal-palette, 200, 100, 700); -$theme-warn: theming.define-palette(mat.$m2-orange-palette, 900); -$theme-success: theming.define-palette(mat.$m2-green-palette, 900); -$theme-error: theming.define-palette(mat.$m2-red-palette, 900); -$theme-info: theming.define-palette(mat.$m2-blue-palette, 900); -$theme-typography: mat.m2-define-typography-config(); -$theme-density: 0; -$theme-light: false; -$theme: theming.define-theme( - $theme-primary, - $theme-accent, - $theme-warn, - $theme-success, - $theme-error, - $theme-info, - $theme-light, - $theme-typography, - $theme-density -); -@include all-themes.all-component-themes($theme); +// The custom red/teal M2 palettes map to the built-in M3 red and cyan +// palettes. Semantic colors keep this theme's deep 900-level hues. +html { + @include theming.theme( + ( + color: ( + primary: mat.$red-palette, + tertiary: mat.$cyan-palette, + theme-type: dark, + ), + typography: Roboto, + density: 0, + ), + ( + success: #1b5e20, + on-success: white, + info: #0d47a1, + on-info: white, + warn: #e65100, + on-warn: white, + ) + ); +} + +@include all-themes.all-component-themes($dark: true); diff --git a/libs/frontend/shared/ui/src/lib/styles/themes/user-custom-dark.scss b/libs/frontend/shared/ui/src/lib/styles/themes/user-custom-dark.scss index b46db9730..1460091ac 100644 --- a/libs/frontend/shared/ui/src/lib/styles/themes/user-custom-dark.scss +++ b/libs/frontend/shared/ui/src/lib/styles/themes/user-custom-dark.scss @@ -1,26 +1,43 @@ @use '@angular/material' as mat; @use '../all-themes'; @use '../theming'; -@use '../palette'; -$theme-primary: theming.define-palette(palette.$primary-palette); -$theme-accent: theming.define-palette(palette.$accent-palette); -$theme-warn: theming.define-palette(palette.$warn-palette); -$theme-success: theming.define-palette(palette.$success-palette); -$theme-error: theming.define-palette(palette.$error-palette); -$theme-info: theming.define-palette(palette.$info-palette); -$theme-typography: mat.m2-define-typography-config(); -$theme-density: 0; -$theme-light: false; -$theme: theming.define-theme( - $theme-primary, - $theme-accent, - $theme-warn, - $theme-success, - $theme-error, - $theme-info, - $theme-light, - $theme-typography, - $theme-density -); -@include all-themes.all-component-themes($theme); +// Base palettes match the hue families of the old defaults (chartreuse for +// the green primary, magenta for the pink accent) so derived tokens such as +// containers stay coherent when no runtime override is provided. +html { + @include theming.theme( + ( + color: ( + primary: mat.$chartreuse-palette, + tertiary: mat.$magenta-palette, + theme-type: dark, + ), + typography: Roboto, + density: 0, + ), + ( + success: var(--success-500, #4caf50), + on-success: var(--success-contrast-500, white), + info: var(--info-500, #2196f3), + on-info: var(--info-contrast-500, white), + warn: var(--warn-500, #ff9800), + on-warn: var(--warn-contrast-500, white), + ) + ); + + // Key roles stay runtime-customizable: apps keep setting the same + // `--primary-500`-style properties they used with the M2 palettes. + @include mat.theme-overrides( + ( + primary: var(--primary-500, #7dcf2a), + on-primary: var(--primary-contrast-500, white), + tertiary: var(--accent-500, #ed00db), + on-tertiary: var(--accent-contrast-500, white), + error: var(--error-500, #f44336), + on-error: var(--error-contrast-500, white), + ) + ); +} + +@include all-themes.all-component-themes($dark: true); diff --git a/libs/frontend/shared/ui/src/lib/styles/themes/user-custom-light.scss b/libs/frontend/shared/ui/src/lib/styles/themes/user-custom-light.scss index 3d32062a1..2b7921d4d 100644 --- a/libs/frontend/shared/ui/src/lib/styles/themes/user-custom-light.scss +++ b/libs/frontend/shared/ui/src/lib/styles/themes/user-custom-light.scss @@ -1,26 +1,43 @@ @use '@angular/material' as mat; @use '../all-themes'; @use '../theming'; -@use '../palette'; -$theme-primary: theming.define-palette(palette.$primary-palette); -$theme-accent: theming.define-palette(palette.$accent-palette); -$theme-warn: theming.define-palette(palette.$warn-palette); -$theme-success: theming.define-palette(palette.$success-palette); -$theme-error: theming.define-palette(palette.$error-palette); -$theme-info: theming.define-palette(palette.$info-palette); -$theme-typography: mat.m2-define-typography-config(); -$theme-density: 0; -$theme-light: true; -$theme: theming.define-theme( - $theme-primary, - $theme-accent, - $theme-warn, - $theme-success, - $theme-error, - $theme-info, - $theme-light, - $theme-typography, - $theme-density -); -@include all-themes.all-component-themes($theme); +// Base palettes match the hue families of the old defaults (chartreuse for +// the green primary, magenta for the pink accent) so derived tokens such as +// containers stay coherent when no runtime override is provided. +html { + @include theming.theme( + ( + color: ( + primary: mat.$chartreuse-palette, + tertiary: mat.$magenta-palette, + theme-type: light, + ), + typography: Roboto, + density: 0, + ), + ( + success: var(--success-500, #4caf50), + on-success: var(--success-contrast-500, white), + info: var(--info-500, #2196f3), + on-info: var(--info-contrast-500, white), + warn: var(--warn-500, #ff9800), + on-warn: var(--warn-contrast-500, white), + ) + ); + + // Key roles stay runtime-customizable: apps keep setting the same + // `--primary-500`-style properties they used with the M2 palettes. + @include mat.theme-overrides( + ( + primary: var(--primary-500, #7dcf2a), + on-primary: var(--primary-contrast-500, white), + tertiary: var(--accent-500, #ed00db), + on-tertiary: var(--accent-contrast-500, white), + error: var(--error-500, #f44336), + on-error: var(--error-contrast-500, white), + ) + ); +} + +@include all-themes.all-component-themes(); diff --git a/libs/frontend/shared/ui/src/test-setup.ts b/libs/frontend/shared/ui/src/test-setup.ts index 4f507b613..ea414013f 100644 --- a/libs/frontend/shared/ui/src/test-setup.ts +++ b/libs/frontend/shared/ui/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/shared/ui/tsconfig.lib.json b/libs/frontend/shared/ui/tsconfig.lib.json index 555eee4f8..641462393 100644 --- a/libs/frontend/shared/ui/tsconfig.lib.json +++ b/libs/frontend/shared/ui/tsconfig.lib.json @@ -9,16 +9,16 @@ "moduleResolution": "bundler" }, "exclude": [ - "**/*.cy.js", - "**/*.cy.jsx", - "**/*.cy.ts", - "**/*.cy.tsx", - "cypress.config.ts", - "cypress/**/*", - "jest.config.ts", "src/**/*.spec.ts", + "src/test-setup.ts", + "jest.config.ts", "src/**/*.test.ts", - "src/test-setup.ts" + "cypress/**/*", + "cypress.config.ts", + "**/*.cy.ts", + "**/*.cy.js", + "**/*.cy.tsx", + "**/*.cy.jsx" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/shared/ui/tsconfig.spec.json b/libs/frontend/shared/ui/tsconfig.spec.json index 96b61d0a2..e87905816 100644 --- a/libs/frontend/shared/ui/tsconfig.spec.json +++ b/libs/frontend/shared/ui/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/shared/ui/vite.config.ts b/libs/frontend/shared/ui/vite.config.ts deleted file mode 100644 index 1fc873b96..000000000 --- a/libs/frontend/shared/ui/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../coverage/libs/frontend/shared/ui', -); diff --git a/libs/frontend/shared/util/CHANGELOG.md b/libs/frontend/shared/util/CHANGELOG.md deleted file mode 100644 index 597eb5fae..000000000 --- a/libs/frontend/shared/util/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# 1.0.0 (2026-07-10) - -### 🩹 Fixes - -- **structure:** fix stale paths missed during role-based restructure ([a012da32](https://github.com/jdwlabs/apps/commit/a012da32)) - -### ❤️ Thank You - -- Claude Sonnet 4.6 -- Jake Willmsen @jdwillmsen diff --git a/libs/frontend/shared/util/README.md b/libs/frontend/shared/util/README.md index 7522e3604..1c3de70b1 100644 --- a/libs/frontend/shared/util/README.md +++ b/libs/frontend/shared/util/README.md @@ -110,3 +110,4 @@ nx test angular-shared-util - This library is framework-agnostic and does not depend on Angular modules. - You can use this library in both Angular apps and Node-based tooling if needed. + diff --git a/libs/frontend/shared/util/jest.config.ts b/libs/frontend/shared/util/jest.config.ts new file mode 100644 index 000000000..5146a1a74 --- /dev/null +++ b/libs/frontend/shared/util/jest.config.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +module.exports = { + displayName: 'frontend-shared-util', + preset: '../../../../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../../../coverage/libs/frontend/shared/util', +}; diff --git a/libs/frontend/shared/util/package.json b/libs/frontend/shared/util/package.json index a78c3b3ab..42dbb3cf5 100644 --- a/libs/frontend/shared/util/package.json +++ b/libs/frontend/shared/util/package.json @@ -1,6 +1,6 @@ { "name": "@jdw/frontend-shared-util", - "version": "1.0.0", + "version": "0.0.1", "dependencies": { "tslib": "^2.8.1", "@angular/common": "^21.2.9", diff --git a/libs/frontend/shared/util/project.json b/libs/frontend/shared/util/project.json index acbc28e66..b38ce3da7 100644 --- a/libs/frontend/shared/util/project.json +++ b/libs/frontend/shared/util/project.json @@ -16,10 +16,10 @@ } }, "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/shared/util/jest.config.ts" } } } diff --git a/libs/frontend/shared/util/src/test-setup.ts b/libs/frontend/shared/util/src/test-setup.ts deleted file mode 100644 index 4f507b613..000000000 --- a/libs/frontend/shared/util/src/test-setup.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '../../../../../tools/testing/angular-test-setup'; diff --git a/libs/frontend/shared/util/tsconfig.lib.json b/libs/frontend/shared/util/tsconfig.lib.json index bf646227e..7a5dc3719 100644 --- a/libs/frontend/shared/util/tsconfig.lib.json +++ b/libs/frontend/shared/util/tsconfig.lib.json @@ -7,10 +7,5 @@ "moduleResolution": "bundler" }, "include": ["src/**/*.ts"], - "exclude": [ - "jest.config.ts", - "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/test-setup.ts" - ] + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] } diff --git a/libs/frontend/shared/util/tsconfig.spec.json b/libs/frontend/shared/util/tsconfig.spec.json index fb31c37b2..4dd755ddc 100644 --- a/libs/frontend/shared/util/tsconfig.spec.json +++ b/libs/frontend/shared/util/tsconfig.spec.json @@ -3,7 +3,7 @@ "compilerOptions": { "outDir": "../../../../dist/out-tsc", "module": "preserve", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/shared/util/vite.config.ts b/libs/frontend/shared/util/vite.config.ts deleted file mode 100644 index cace90006..000000000 --- a/libs/frontend/shared/util/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../coverage/libs/frontend/shared/util', -); diff --git a/libs/frontend/usersui/data-access/README.md b/libs/frontend/usersui/data-access/README.md index 31f152988..ee4167186 100644 --- a/libs/frontend/usersui/data-access/README.md +++ b/libs/frontend/usersui/data-access/README.md @@ -44,7 +44,7 @@ export class ProfileManager { private profilesService = inject(ProfilesService); loadProfiles(): void { - this.profilesService.getProfiles().subscribe((profiles) => { + this.profilesService.getProfiles().subscribe(profiles => { console.log(profiles); }); } diff --git a/libs/frontend/usersui/data-access/jest.config.ts b/libs/frontend/usersui/data-access/jest.config.ts new file mode 100644 index 000000000..6f7218f66 --- /dev/null +++ b/libs/frontend/usersui/data-access/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +module.exports = { + displayName: 'frontend-usersui-data-access', + preset: '../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../../coverage/libs/frontend/usersui/data-access', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/usersui/data-access/project.json b/libs/frontend/usersui/data-access/project.json index c077fba2f..d0b425505 100644 --- a/libs/frontend/usersui/data-access/project.json +++ b/libs/frontend/usersui/data-access/project.json @@ -7,10 +7,10 @@ "tags": ["type:data-access", "scope:usersui", "framework:angular"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/usersui/data-access/jest.config.ts" } }, "lint": { diff --git a/libs/frontend/usersui/data-access/src/lib/profiles/profiles.service.spec.ts b/libs/frontend/usersui/data-access/src/lib/profiles/profiles.service.spec.ts index e9746fec0..7b5f9b9f4 100644 --- a/libs/frontend/usersui/data-access/src/lib/profiles/profiles.service.spec.ts +++ b/libs/frontend/usersui/data-access/src/lib/profiles/profiles.service.spec.ts @@ -17,12 +17,12 @@ import { import { EMPTY } from 'rxjs'; const authServiceMock = { - getToken: vi.fn(), + getToken: jest.fn(), }; const snackbarServiceMock = { - error: vi.fn(), - success: vi.fn(), + error: jest.fn(), + success: jest.fn(), }; const environmentMock = { diff --git a/libs/frontend/usersui/data-access/src/test-setup.ts b/libs/frontend/usersui/data-access/src/test-setup.ts index 4f507b613..ea414013f 100644 --- a/libs/frontend/usersui/data-access/src/test-setup.ts +++ b/libs/frontend/usersui/data-access/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/usersui/data-access/tsconfig.lib.json b/libs/frontend/usersui/data-access/tsconfig.lib.json index df76464e4..912738705 100644 --- a/libs/frontend/usersui/data-access/tsconfig.lib.json +++ b/libs/frontend/usersui/data-access/tsconfig.lib.json @@ -8,10 +8,10 @@ "types": [] }, "exclude": [ - "jest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/test-setup.ts" + "src/test-setup.ts", + "jest.config.ts", + "src/**/*.test.ts" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/usersui/data-access/tsconfig.spec.json b/libs/frontend/usersui/data-access/tsconfig.spec.json index 96b61d0a2..e87905816 100644 --- a/libs/frontend/usersui/data-access/tsconfig.spec.json +++ b/libs/frontend/usersui/data-access/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/usersui/data-access/vite.config.ts b/libs/frontend/usersui/data-access/vite.config.ts deleted file mode 100644 index e999bffd5..000000000 --- a/libs/frontend/usersui/data-access/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../coverage/libs/frontend/usersui/data-access', -); diff --git a/libs/frontend/usersui/feature/core/README.md b/libs/frontend/usersui/feature/core/README.md index 9745521f6..1c4fdb50f 100644 --- a/libs/frontend/usersui/feature/core/README.md +++ b/libs/frontend/usersui/feature/core/README.md @@ -43,16 +43,12 @@ export const routes: Route[] = [ { path: 'user', loadComponent: () => - import('@jdw/angular-usersui-feature-core/user').then( - (m) => m.UserComponent, - ), + import('@jdw/angular-usersui-feature-core/user').then(m => m.UserComponent), }, { path: 'profile', loadComponent: () => - import('@jdw/angular-usersui-feature-core/profile').then( - (m) => m.ProfileComponent, - ), + import('@jdw/angular-usersui-feature-core/profile').then(m => m.ProfileComponent), }, ]; ``` @@ -68,7 +64,8 @@ import { DashboardComponent } from '@jdw/angular-usersui-feature-core/dashboard' imports: [DashboardComponent], template: ``, }) -export class WrapperComponent {} +export class WrapperComponent { +} ``` --- diff --git a/libs/frontend/usersui/feature/core/jest.config.ts b/libs/frontend/usersui/feature/core/jest.config.ts new file mode 100644 index 000000000..0405a1b75 --- /dev/null +++ b/libs/frontend/usersui/feature/core/jest.config.ts @@ -0,0 +1,23 @@ +/* eslint-disable */ +module.exports = { + displayName: 'frontend-usersui-feature-core', + preset: '../../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: + '../../../../../coverage/libs/frontend/usersui/feature/core', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/usersui/feature/core/project.json b/libs/frontend/usersui/feature/core/project.json index 177100d64..8087689c7 100644 --- a/libs/frontend/usersui/feature/core/project.json +++ b/libs/frontend/usersui/feature/core/project.json @@ -7,10 +7,10 @@ "tags": ["type:feature", "scope:usersui", "framework:angular"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/usersui/feature/core/jest.config.ts" } }, "lint": { diff --git a/libs/frontend/usersui/feature/core/src/lib/icon/icon.component.spec.ts b/libs/frontend/usersui/feature/core/src/lib/icon/icon.component.spec.ts index 8c7e61eb3..8e8a92752 100644 --- a/libs/frontend/usersui/feature/core/src/lib/icon/icon.component.spec.ts +++ b/libs/frontend/usersui/feature/core/src/lib/icon/icon.component.spec.ts @@ -14,9 +14,9 @@ describe('IconComponent', () => { beforeEach(async () => { mockProfilesService = { - getIcon: vi.fn().mockReturnValue(of(null)), - addIcon: vi.fn().mockReturnValue(of({ userId: 1 })), - editIcon: vi.fn().mockReturnValue(of({ userId: 1 })), + getIcon: jest.fn().mockReturnValue(of(null)), + addIcon: jest.fn().mockReturnValue(of({ userId: 1 })), + editIcon: jest.fn().mockReturnValue(of({ userId: 1 })), }; await TestBed.configureTestingModule({ @@ -81,7 +81,7 @@ describe('IconComponent', () => { it('should set selected file on valid upload', () => { const file = new File(['dummy'], 'image.png', { type: 'image/png' }); const objectURL = 'blob://dummy-url'; - global.URL.createObjectURL = vi.fn().mockReturnValue(objectURL); + global.URL.createObjectURL = jest.fn().mockReturnValue(objectURL); component.processFile(file); diff --git a/libs/frontend/usersui/feature/core/src/lib/profile-dialog/profile-dialog.component.spec.ts b/libs/frontend/usersui/feature/core/src/lib/profile-dialog/profile-dialog.component.spec.ts index 4cb544762..a0482c4ee 100644 --- a/libs/frontend/usersui/feature/core/src/lib/profile-dialog/profile-dialog.component.spec.ts +++ b/libs/frontend/usersui/feature/core/src/lib/profile-dialog/profile-dialog.component.spec.ts @@ -47,7 +47,7 @@ const mockData: DialogData & Profile = { }; const mockDialogRef = { - close: vi.fn(), + close: jest.fn(), }; describe('ProfileDialogComponent', () => { diff --git a/libs/frontend/usersui/feature/core/src/lib/profiles/profiles.component.spec.ts b/libs/frontend/usersui/feature/core/src/lib/profiles/profiles.component.spec.ts index a59cf0bf0..a44cd1ead 100644 --- a/libs/frontend/usersui/feature/core/src/lib/profiles/profiles.component.spec.ts +++ b/libs/frontend/usersui/feature/core/src/lib/profiles/profiles.component.spec.ts @@ -89,7 +89,7 @@ describe('ProfilesComponent', () => { { provide: ProfilesService, useValue: { - getProfiles: vi.fn(() => of(mockProfiles)), + getProfiles: jest.fn(() => of(mockProfiles)), }, }, ], diff --git a/libs/frontend/usersui/feature/core/src/lib/user-dialog/user-dialog.component.spec.ts b/libs/frontend/usersui/feature/core/src/lib/user-dialog/user-dialog.component.spec.ts index accbbcb4f..92c2372dd 100644 --- a/libs/frontend/usersui/feature/core/src/lib/user-dialog/user-dialog.component.spec.ts +++ b/libs/frontend/usersui/feature/core/src/lib/user-dialog/user-dialog.component.spec.ts @@ -65,7 +65,7 @@ const mockData: DialogData & User = { }; const mockDialogRef = { - close: vi.fn(), + close: jest.fn(), }; describe('UserDialogComponent', () => { diff --git a/libs/frontend/usersui/feature/core/src/lib/user/user.component.spec.ts b/libs/frontend/usersui/feature/core/src/lib/user/user.component.spec.ts index 433499a0f..1fc5d2c0e 100644 --- a/libs/frontend/usersui/feature/core/src/lib/user/user.component.spec.ts +++ b/libs/frontend/usersui/feature/core/src/lib/user/user.component.spec.ts @@ -81,11 +81,11 @@ const mockRole: Role = { }; const mockUsersService = { - getUser: vi.fn(() => of(mockUser)), + getUser: jest.fn(() => of(mockUser)), }; const mockRolesService = { - getRole: vi.fn(() => of(mockRole)), + getRole: jest.fn(() => of(mockRole)), }; describe('UserComponent', () => { diff --git a/libs/frontend/usersui/feature/core/src/lib/users/users.component.spec.ts b/libs/frontend/usersui/feature/core/src/lib/users/users.component.spec.ts index efaeeb870..979ad06f2 100644 --- a/libs/frontend/usersui/feature/core/src/lib/users/users.component.spec.ts +++ b/libs/frontend/usersui/feature/core/src/lib/users/users.component.spec.ts @@ -52,7 +52,7 @@ describe('UsersComponent', () => { { provide: UsersService, useValue: { - getUsers: vi.fn(() => of(mockUsers)), + getUsers: jest.fn(() => of(mockUsers)), }, }, ], diff --git a/libs/frontend/usersui/feature/core/src/test-setup.ts b/libs/frontend/usersui/feature/core/src/test-setup.ts index ad8bd0946..ea414013f 100644 --- a/libs/frontend/usersui/feature/core/src/test-setup.ts +++ b/libs/frontend/usersui/feature/core/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/usersui/feature/core/tsconfig.lib.json b/libs/frontend/usersui/feature/core/tsconfig.lib.json index 3fbebaa7f..7ac1edba1 100644 --- a/libs/frontend/usersui/feature/core/tsconfig.lib.json +++ b/libs/frontend/usersui/feature/core/tsconfig.lib.json @@ -8,16 +8,16 @@ "types": [] }, "exclude": [ - "**/*.cy.js", - "**/*.cy.jsx", - "**/*.cy.ts", - "**/*.cy.tsx", - "cypress.config.ts", - "cypress/**/*", - "jest.config.ts", "src/**/*.spec.ts", + "src/test-setup.ts", + "jest.config.ts", "src/**/*.test.ts", - "src/test-setup.ts" + "cypress/**/*", + "cypress.config.ts", + "**/*.cy.ts", + "**/*.cy.js", + "**/*.cy.tsx", + "**/*.cy.jsx" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/usersui/feature/core/tsconfig.spec.json b/libs/frontend/usersui/feature/core/tsconfig.spec.json index 4e1eb0c3f..b03ed70a5 100644 --- a/libs/frontend/usersui/feature/core/tsconfig.spec.json +++ b/libs/frontend/usersui/feature/core/tsconfig.spec.json @@ -4,7 +4,7 @@ "outDir": "../../../../../dist/out-tsc", "module": "preserve", "target": "es2016", - "types": ["vitest/globals", "node"], + "types": ["jest", "node"], "moduleResolution": "bundler", "isolatedModules": true }, diff --git a/libs/frontend/usersui/feature/core/vite.config.ts b/libs/frontend/usersui/feature/core/vite.config.ts deleted file mode 100644 index 8e338b2ca..000000000 --- a/libs/frontend/usersui/feature/core/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../../coverage/libs/frontend/usersui/feature/core', -); diff --git a/libs/frontend/usersui/util/jest.config.ts b/libs/frontend/usersui/util/jest.config.ts new file mode 100644 index 000000000..6045e82b7 --- /dev/null +++ b/libs/frontend/usersui/util/jest.config.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +module.exports = { + displayName: 'frontend-usersui-util', + preset: '../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../../coverage/libs/frontend/usersui/util', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/frontend/usersui/util/project.json b/libs/frontend/usersui/util/project.json index ba1255483..57697b5be 100644 --- a/libs/frontend/usersui/util/project.json +++ b/libs/frontend/usersui/util/project.json @@ -7,10 +7,10 @@ "tags": ["type:util", "scope:usersui", "framework:angular"], "targets": { "test": { - "executor": "@analogjs/vitest-angular:test", + "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "configFile": "vite.config.ts" + "jestConfig": "libs/frontend/usersui/util/jest.config.ts" } }, "lint": { diff --git a/libs/frontend/usersui/util/src/test-setup.ts b/libs/frontend/usersui/util/src/test-setup.ts index 4f507b613..ea414013f 100644 --- a/libs/frontend/usersui/util/src/test-setup.ts +++ b/libs/frontend/usersui/util/src/test-setup.ts @@ -1 +1,6 @@ -export * from '../../../../../tools/testing/angular-test-setup'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/frontend/usersui/util/tsconfig.lib.json b/libs/frontend/usersui/util/tsconfig.lib.json index df76464e4..912738705 100644 --- a/libs/frontend/usersui/util/tsconfig.lib.json +++ b/libs/frontend/usersui/util/tsconfig.lib.json @@ -8,10 +8,10 @@ "types": [] }, "exclude": [ - "jest.config.ts", "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/test-setup.ts" + "src/test-setup.ts", + "jest.config.ts", + "src/**/*.test.ts" ], "include": ["src/**/*.ts"] } diff --git a/libs/frontend/usersui/util/tsconfig.spec.json b/libs/frontend/usersui/util/tsconfig.spec.json index 25eb58c54..5b038e05c 100644 --- a/libs/frontend/usersui/util/tsconfig.spec.json +++ b/libs/frontend/usersui/util/tsconfig.spec.json @@ -2,11 +2,10 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "../../../../dist/out-tsc", - "module": "preserve", + "module": "commonjs", "target": "es2016", - "types": ["vitest/globals", "node"], - "isolatedModules": true, - "moduleResolution": "bundler" + "types": ["jest", "node"], + "isolatedModules": true }, "files": ["src/test-setup.ts"], "include": [ diff --git a/libs/frontend/usersui/util/vite.config.ts b/libs/frontend/usersui/util/vite.config.ts deleted file mode 100644 index 2266a1102..000000000 --- a/libs/frontend/usersui/util/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createAngularViteConfig } from '../../../../tools/testing/angular-vite.config'; - -export default createAngularViteConfig( - '../../../../coverage/libs/frontend/usersui/util', -); diff --git a/nx.json b/nx.json index 87f06b137..c7f63938f 100644 --- a/nx.json +++ b/nx.json @@ -9,7 +9,7 @@ "!{projectRoot}/eslint.config.ts", "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)", "!{projectRoot}/tsconfig.spec.json", - "!{projectRoot}/vite.config.[jt]s", + "!{projectRoot}/jest.config.[jt]s", "!{projectRoot}/src/test-setup.[jt]s", "!{projectRoot}/test-setup.[jt]s", "!{projectRoot}/**/*.spec.[jt]s?(x)", @@ -34,13 +34,18 @@ "{workspaceRoot}/tools/eslint-rules/**/*" ] }, - "@analogjs/vitest-angular:test": { + "@nx/jest:jest": { "cache": true, - "inputs": ["default", "^production"] - }, - "@nx/vitest:test": { - "cache": true, - "inputs": ["default", "^production"] + "inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"], + "options": { + "passWithNoTests": true + }, + "configurations": { + "ci": { + "ci": true, + "codeCoverage": true + } + } }, "e2e": { "cache": true, @@ -90,47 +95,16 @@ "dependsOn": ["build", "^build"] } }, - "release": { - "projectsRelationship": "independent", - "projects": [ - "authui", - "container", - "rolesui", - "usersui", - "servicediscovery", - "usersrole", - "authdb", - "ai-sre-relay", - "frontend-shared-ui", - "frontend-shared-util" - ], - "releaseTagPattern": "{projectName}-{version}", - "git": { - "commitMessage": "chore(release): publish [skip ci]", - "push": true - }, - "version": { - "conventionalCommits": true, - "fallbackCurrentVersionResolver": "disk" - }, - "changelog": { - "workspaceChangelog": false, - "automaticFromRef": true, - "projectChangelogs": { - "createRelease": "github" - } - } - }, "generators": { "@nx/angular:application": { "e2eTestRunner": "playwright", "linter": "eslint", "style": "scss", - "unitTestRunner": "vitest-analog" + "unitTestRunner": "jest" }, "@nx/angular:library": { "linter": "eslint", - "unitTestRunner": "vitest-analog" + "unitTestRunner": "jest" }, "@nx/angular:component": { "style": "scss", @@ -205,5 +179,6 @@ }, "@nx-go/nx-go" ], - "defaultBase": "main" + "defaultBase": "main", + "nxCloudId": "69e5ca23f497e47cfe103a29" } diff --git a/package.json b/package.json index 53ace9c68..ecf33efc2 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,12 @@ }, "private": true, "devDependencies": { - "@analogjs/vite-plugin-angular": "2.6.2", - "@analogjs/vitest-angular": "2.6.2", "@angular-devkit/build-angular": "21.2.9", "@angular-devkit/core": "21.2.9", "@angular-devkit/schematics": "21.2.9", - "@angular-eslint/eslint-plugin": "21.4.0", - "@angular-eslint/eslint-plugin-template": "21.4.0", - "@angular-eslint/template-parser": "21.4.0", + "@angular-eslint/eslint-plugin": "21.2.0", + "@angular-eslint/eslint-plugin-template": "21.2.0", + "@angular-eslint/template-parser": "21.2.0", "@angular/cdk": "21.2.9", "@angular/cli": "21.2.12", "@angular/compiler-cli": "21.2.9", @@ -24,7 +22,7 @@ "@angular/material": "21.2.9", "@commitlint/cli": "^19.6.0", "@commitlint/config-conventional": "^19.6.0", - "@eslint/js": "10.0.1", + "@jscutlery/semver": "^5.5.1", "@module-federation/enhanced": "^2.1.0", "@nx-go/nx-go": "^4.0.0", "@nx-tools/container-metadata": "^6.1.1", @@ -34,10 +32,10 @@ "@nx/eslint": "22.7.3", "@nx/eslint-plugin": "22.7.3", "@nx/gradle": "22.7.3", + "@nx/jest": "22.7.3", "@nx/js": "22.7.3", "@nx/module-federation": "22.7.3", "@nx/playwright": "^22.7.3", - "@nx/vitest": "22.7.3", "@nx/web": "22.7.3", "@nx/webpack": "22.7.3", "@nx/workspace": "22.7.3", @@ -46,21 +44,25 @@ "@swc-node/register": "1.11.1", "@swc/core": "1.15.8", "@swc/helpers": "0.5.18", + "@types/jest": "30.0.0", "@types/node": "^22.10.1", - "@typescript-eslint/eslint-plugin": "8.61.0", - "@typescript-eslint/parser": "8.61.0", - "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/eslint-plugin": "8.40.0", + "@typescript-eslint/parser": "8.40.0", + "@typescript-eslint/utils": "8.40.0", "angular-eslint": "^21.4.0", "autoprefixer": "^10.4.20", "commitizen": "^4.3.1", "cz-conventional-changelog": "^3.3.0", - "eslint": "10.4.1", - "eslint-config-prettier": "10.1.8", + "eslint": "9.39.4", + "eslint-config-prettier": "10.0.0", "globals": "^17.6.0", "html-webpack-plugin": "^5.6.3", "husky": "^9.1.7", + "jest": "30.0.0", + "jest-environment-jsdom": "30.0.0", + "jest-environment-node": "^29.7.0", + "jest-preset-angular": "16.0.0", "jest-util": "30.0.0", - "jsdom": "^29.1.1", "jsonc-eslint-parser": "^2.4.0", "jwt-decode": "^4.0.0", "lint-staged": "^17.0.5", @@ -70,35 +72,14 @@ "postcss": "^8.4.49", "postcss-url": "~10.1.3", "prettier": "^3.4.2", + "ts-jest": "29.4.9", "ts-node": "10.9.2", "typescript": "5.9.3", - "typescript-eslint": "^8.61.0", - "vite-tsconfig-paths": "^6.1.1", - "vitest": "^4.1.9" + "typescript-eslint": "^8.60.0" }, "pnpm": { "overrides": { - "memfs": "4.56.11", - "@babel/core@<7.29.6": "^7.29.6", - "esbuild@<0.28.1": "^0.28.1", - "form-data@<4.0.6": "^4.0.6", - "hono@<4.12.25": "^4.12.25", - "http-proxy-middleware@2": "^2.0.10", - "http-proxy-middleware@3": "^3.0.7", - "js-yaml@3": "^3.15.0", - "js-yaml@4": "^4.2.0", - "launch-editor@<2.14.1": "^2.14.1", - "lodash@<4.18.0": "^4.18.1", - "piscina@<5.2.0": "^5.2.0", - "qs@<6.15.2": "^6.15.2", - "systeminformation@<5.31.6": "^5.31.6", - "tar@7": "^7.5.16", - "tmp@<0.2.6": "^0.2.7", - "undici@<6.27.0": "^6.27.0", - "undici@7": "^7.28.0", - "uuid@<9": "^11.1.1", - "vite@<7.3.5": "^7.3.5", - "webpack-dev-server@<5.2.5": "^5.2.5" + "memfs": "4.56.11" }, "onlyBuiltDependencies": [ "@swc/core", @@ -123,9 +104,9 @@ "dependencies": { "@angular/animations": "21.2.9", "@angular/cdk": "21.2.9", - "@angular/common": "21.2.17", - "@angular/compiler": "21.2.17", - "@angular/core": "21.2.17", + "@angular/common": "21.2.9", + "@angular/compiler": "21.2.9", + "@angular/core": "21.2.9", "@angular/forms": "21.2.9", "@angular/material": "21.2.9", "@angular/material-moment-adapter": "21.2.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 565e235da..052a8e638 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,26 +6,6 @@ settings: overrides: memfs: 4.56.11 - '@babel/core@<7.29.6': ^7.29.6 - esbuild@<0.28.1: ^0.28.1 - form-data@<4.0.6: ^4.0.6 - hono@<4.12.25: ^4.12.25 - http-proxy-middleware@2: ^2.0.10 - http-proxy-middleware@3: ^3.0.7 - js-yaml@3: ^3.15.0 - js-yaml@4: ^4.2.0 - launch-editor@<2.14.1: ^2.14.1 - lodash@<4.18.0: ^4.18.1 - piscina@<5.2.0: ^5.2.0 - qs@<6.15.2: ^6.15.2 - systeminformation@<5.31.6: ^5.31.6 - tar@7: ^7.5.16 - tmp@<0.2.6: ^0.2.7 - undici@<6.27.0: ^6.27.0 - undici@7: ^7.28.0 - uuid@<9: ^11.1.1 - vite@<7.3.5: ^7.3.5 - webpack-dev-server@<5.2.5: ^5.2.5 importers: @@ -33,40 +13,40 @@ importers: dependencies: '@angular/animations': specifier: 21.2.9 - version: 21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + version: 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/cdk': specifier: 21.2.9 - version: 21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + version: 21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/common': - specifier: 21.2.17 - version: 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + specifier: 21.2.9 + version: 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) '@angular/compiler': - specifier: 21.2.17 - version: 21.2.17 + specifier: 21.2.9 + version: 21.2.9 '@angular/core': - specifier: 21.2.17 - version: 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) + specifier: 21.2.9 + version: 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) '@angular/forms': specifier: 21.2.9 - version: 21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + version: 21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) '@angular/material': specifier: 21.2.9 - version: 21.2.9(b714a1b1cbe0063e64a2c2926bd28b9a) + version: 21.2.9(1a0f58261cc7dd308ee8aff5dec3823f) '@angular/material-moment-adapter': specifier: 21.2.9 - version: 21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/material@21.2.9(b714a1b1cbe0063e64a2c2926bd28b9a))(moment@2.30.1) + version: 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/material@21.2.9(1a0f58261cc7dd308ee8aff5dec3823f))(moment@2.30.1) '@angular/platform-browser': specifier: 21.2.9 - version: 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + version: 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) '@angular/platform-browser-dynamic': specifier: 21.2.9 - version: 21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@21.2.17)(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))) + version: 21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@21.2.9)(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))) '@angular/router': specifier: 21.2.9 - version: 21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + version: 21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) ag-grid-angular: specifier: ^32.3.3 - version: 32.3.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(ag-grid-community@32.3.9) + version: 32.3.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(ag-grid-community@32.3.9) ag-grid-community: specifier: ^32.3.3 version: 32.3.9 @@ -80,15 +60,9 @@ importers: specifier: 0.16.2 version: 0.16.2 devDependencies: - '@analogjs/vite-plugin-angular': - specifier: 2.6.2 - version: 2.6.2(@angular-devkit/build-angular@21.2.9(295d2e4e0ca82eebfa5597348c175ee6))(@angular/build@21.2.9(0deaaa798e212dc863fa34ccc5708123))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) - '@analogjs/vitest-angular': - specifier: 2.6.2 - version: 2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.9(295d2e4e0ca82eebfa5597348c175ee6))(@angular/build@21.2.9(0deaaa798e212dc863fa34ccc5708123))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.12(chokidar@5.0.0))(@angular-devkit/schematics@21.2.9(chokidar@5.0.0))(vitest@4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)))(zone.js@0.16.2) '@angular-devkit/build-angular': specifier: 21.2.9 - version: 21.2.9(295d2e4e0ca82eebfa5597348c175ee6) + version: 21.2.9(a9fd8aa867e20e7d10d62fc3ab6618cf) '@angular-devkit/core': specifier: 21.2.9 version: 21.2.9(chokidar@5.0.0) @@ -96,20 +70,20 @@ importers: specifier: 21.2.9 version: 21.2.9(chokidar@5.0.0) '@angular-eslint/eslint-plugin': - specifier: 21.4.0 - version: 21.4.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + specifier: 21.2.0 + version: 21.2.0(@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@angular-eslint/eslint-plugin-template': - specifier: 21.4.0 - version: 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.61.0)(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + specifier: 21.2.0 + version: 21.2.0(@angular-eslint/template-parser@21.2.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.60.0)(@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@angular-eslint/template-parser': - specifier: 21.4.0 - version: 21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + specifier: 21.2.0 + version: 21.2.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@angular/cli': specifier: 21.2.12 version: 21.2.12(@types/node@22.19.19)(chokidar@5.0.0) '@angular/compiler-cli': specifier: 21.2.9 - version: 21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3) + version: 21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3) '@angular/language-service': specifier: 21.2.9 version: 21.2.9 @@ -119,9 +93,9 @@ importers: '@commitlint/config-conventional': specifier: ^19.6.0 version: 19.8.1 - '@eslint/js': - specifier: 10.0.1 - version: 10.0.1(eslint@10.4.1(jiti@2.7.0)) + '@jscutlery/semver': + specifier: ^5.5.1 + version: 5.8.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(@types/node@22.19.19) '@module-federation/enhanced': specifier: ^2.1.0 version: 2.5.0(@rspack/core@1.7.11(@swc/helpers@0.5.18))(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) @@ -133,40 +107,40 @@ importers: version: 6.9.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(tslib@2.8.1) '@nx-tools/nx-container': specifier: ^6.1.1 - version: 6.9.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(@nx/js@22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(dotenv@16.4.7)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(tslib@2.8.1) + version: 6.9.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(@nx/js@22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(dotenv@16.4.7)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(tslib@2.8.1) '@nx/angular': specifier: 22.7.3 - version: 22.7.3(9ea0010a601f02beef0727647a40b461) + version: 22.7.3(0b4e8de3d8c1b3fb3068996a2ee39e36) '@nx/devkit': specifier: 22.7.3 version: 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) '@nx/eslint': specifier: 22.7.3 - version: 22.7.3(009a8c00054d1b9afc3e70df1013dd04) + version: 22.7.3(2d77eedacad4a73d9b45ca88b5c668cd) '@nx/eslint-plugin': specifier: 22.7.3 - version: 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3) + version: 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@typescript-eslint/parser@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-config-prettier@10.0.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3) '@nx/gradle': specifier: 22.7.3 version: 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/jest': + specifier: 22.7.3 + version: 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3))(typescript@5.9.3) '@nx/js': specifier: 22.7.3 - version: 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + version: 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) '@nx/module-federation': specifier: 22.7.3 - version: 22.7.3(1e7568c88119a8f46b3f44f17e8832c5) + version: 22.7.3(a144bf2648da73d5ce3e21944d7ee54c) '@nx/playwright': specifier: ^22.7.3 - version: 22.7.3(7fac41d12d50220d9e07e10b5d144c50) - '@nx/vitest': - specifier: 22.7.3 - version: 22.7.3(@babel/traverse@7.29.7)(@nx/eslint@22.7.3(009a8c00054d1b9afc3e70df1013dd04))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))) + version: 22.7.3(5bbbe0927bab20b4820e03db46deb542) '@nx/web': specifier: 22.7.3 - version: 22.7.3(ec92657a68652fe73393dccf800c48eb) + version: 22.7.3(7514bcef48269a0eaddae493b1040ef3) '@nx/webpack': specifier: 22.7.3 - version: 22.7.3(@babel/traverse@7.29.7)(@rspack/core@1.7.11(@swc/helpers@0.5.18))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3) + version: 22.7.3(@babel/traverse@7.29.0)(@rspack/core@1.7.11(@swc/helpers@0.5.18))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3) '@nx/workspace': specifier: 22.7.3 version: 22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)) @@ -185,21 +159,24 @@ importers: '@swc/helpers': specifier: 0.5.18 version: 0.5.18 + '@types/jest': + specifier: 30.0.0 + version: 30.0.0 '@types/node': specifier: ^22.10.1 version: 22.19.19 '@typescript-eslint/eslint-plugin': - specifier: 8.61.0 - version: 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + specifier: 8.40.0 + version: 8.40.0(@typescript-eslint/parser@8.40.0(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': - specifier: 8.61.0 - version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + specifier: 8.40.0 + version: 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/utils': - specifier: 8.61.0 - version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + specifier: 8.40.0 + version: 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) angular-eslint: specifier: ^21.4.0 - version: 21.4.0(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.4.1(jiti@2.7.0))(typescript-eslint@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(typescript@5.9.3) + version: 21.4.0(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.4(jiti@2.7.0))(typescript-eslint@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(typescript@5.9.3) autoprefixer: specifier: ^10.4.20 version: 10.5.0(postcss@8.5.15) @@ -210,11 +187,11 @@ importers: specifier: ^3.3.0 version: 3.3.0(@types/node@22.19.19)(typescript@5.9.3) eslint: - specifier: 10.4.1 - version: 10.4.1(jiti@2.7.0) + specifier: 9.39.4 + version: 9.39.4(jiti@2.7.0) eslint-config-prettier: - specifier: 10.1.8 - version: 10.1.8(eslint@10.4.1(jiti@2.7.0)) + specifier: 10.0.0 + version: 10.0.0(eslint@9.39.4(jiti@2.7.0)) globals: specifier: ^17.6.0 version: 17.6.0 @@ -224,12 +201,21 @@ importers: husky: specifier: ^9.1.7 version: 9.1.7 + jest: + specifier: 30.0.0 + version: 30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + jest-environment-jsdom: + specifier: 30.0.0 + version: 30.0.0 + jest-environment-node: + specifier: ^29.7.0 + version: 29.7.0 + jest-preset-angular: + specifier: 16.0.0 + version: 16.0.0(858bae5f0c1a0b3d44321e7d1a8fdb12) jest-util: specifier: 30.0.0 version: 30.0.0 - jsdom: - specifier: ^29.1.1 - version: 29.1.1 jsonc-eslint-parser: specifier: ^2.4.0 version: 2.4.2 @@ -241,10 +227,10 @@ importers: version: 17.0.5 ng-packagr: specifier: 21.2.3 - version: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + version: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) ngx-cookie-service: specifier: ^20.0.0 - version: 20.1.1(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + version: 20.1.1(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) nx: specifier: 22.7.3 version: 22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)) @@ -257,6 +243,9 @@ importers: prettier: specifier: ^3.4.2 version: 3.8.3 + ts-jest: + specifier: 29.4.9 + version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.0))(esbuild@0.28.0)(jest-util@30.0.0)(jest@30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)))(typescript@5.9.3) ts-node: specifier: 10.9.2 version: 10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3) @@ -264,14 +253,8 @@ importers: specifier: 5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.61.0 - version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - vite-tsconfig-paths: - specifier: ^6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) - vitest: - specifier: ^4.1.9 - version: 4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) + specifier: ^8.60.0 + version: 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) packages: @@ -350,32 +333,6 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@analogjs/vite-plugin-angular@2.6.2': - resolution: {integrity: sha512-XbrdII0OpQcOfiyJ8N+FSlhF+Y+oEpLFkN35aJBh2QhhOrtHWX4XcqulcZwLJRU67eawfh/Bu6jJ3sSGLVEc4Q==} - peerDependencies: - '@angular-devkit/build-angular': ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 - '@angular/build': ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 - vite: ^7.3.5 - peerDependenciesMeta: - '@angular-devkit/build-angular': - optional: true - '@angular/build': - optional: true - vite: - optional: true - - '@analogjs/vitest-angular@2.6.2': - resolution: {integrity: sha512-aLyvyqv2bpgNXDhWwR5M974RVuF2TFfFfFIn2OuwRO7hf+w60v/GaJxvbFob8f7VJgztvoVGgDhWpu2Qon/dmg==} - peerDependencies: - '@analogjs/vite-plugin-angular': '*' - '@angular-devkit/architect': '>=0.1700.0 < 0.2300.0 || >=0.2200.0 < 0.2300.0' - '@angular-devkit/schematics': '>=17.0.0' - vitest: ^1.3.1 || ^2.0.0 || ^3.0.0 || ^4.0.0 - zone.js: '>=0.14.0' - peerDependenciesMeta: - zone.js: - optional: true - '@angular-devkit/architect@0.2102.12': resolution: {integrity: sha512-w9FSMHYeeHkk0kRSAOCvNqEVyOHqpC1SUf3iN7tDnXBOA0dtc6JYvJU7O4joiwf7wMPZDK8LKc/6eu8/Tx87Fw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -441,7 +398,7 @@ packages: engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: webpack: ^5.30.0 - webpack-dev-server: ^5.2.5 + webpack-dev-server: ^5.0.2 '@angular-devkit/core@21.2.12': resolution: {integrity: sha512-nXms0jVWwHOJK+z6vHvhw7HYFBelxh2gEnkij0OQMABXZN5hoUlTD0DDP1lYR7hQNi8Yb2Ar0UN9ihyUFVM5Kg==} @@ -476,9 +433,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' + '@angular-eslint/bundled-angular-compiler@21.2.0': + resolution: {integrity: sha512-J0DWL+j6t9ItFIyIADvzHGqwDA1qfVJ9bx+oTmJ/Hlo7cUpIRoXpcTXpug0CEEABFH0RfDu6PDG2b0FoZ1+7bg==} + '@angular-eslint/bundled-angular-compiler@21.4.0': resolution: {integrity: sha512-/3H4BPbQ1BHJkkrUsfusZtmHc+qiFWBBZ9UDPWah4xZMjflexOK9U4GYeH7nMjcuyqFnIlMMeJJNwNLGt/hmdg==} + '@angular-eslint/eslint-plugin-template@21.2.0': + resolution: {integrity: sha512-lJ13Dj0DjR6YiceQR0sRbyWzSzOQ6uZPwK9CJUF3wuZjYAUvL1D61zaU9QrVLtf89NVOxv+dYZHDdu3IDeIqbA==} + peerDependencies: + '@angular-eslint/template-parser': 21.2.0 + '@typescript-eslint/types': ^7.11.0 || ^8.0.0 + '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + '@angular-eslint/eslint-plugin-template@21.4.0': resolution: {integrity: sha512-sJEHx2WYnvOgPpzP1eHnUdRS06zgKmRxbiIR0JiCcaSen5iv1HlsMieXy//FS9TtNW+abHOy4UtDuGuSPflPFA==} peerDependencies: @@ -488,6 +457,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' + '@angular-eslint/eslint-plugin@21.2.0': + resolution: {integrity: sha512-X2Qn2viDsjm91CEMxNrxDH3qkKpp6un0C1F1BW2p/m9J4AUVfOcXwWz9UpHFSHTRQ+YlTJbiH1ZwwAPeKhFaxA==} + peerDependencies: + '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + '@angular-eslint/eslint-plugin@21.4.0': resolution: {integrity: sha512-mow2DMj+xBvGl5t7jzC34R8YfbHbaGNyCNFzpovtl9qc0JbuqLyg6htmt8xb05f8ZjATOr4nz0ESt6HV4c51hw==} peerDependencies: @@ -500,12 +476,25 @@ packages: peerDependencies: '@angular/cli': '>= 21.0.0 < 22.0.0' + '@angular-eslint/template-parser@21.2.0': + resolution: {integrity: sha512-TCb3qYOC/uXKZCo56cJ6N9sHeWdFhyVqrbbYfFjTi09081T6jllgHDZL5Ms7gOMNY8KywWGGbhxwvzeA0RwTgA==} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + '@angular-eslint/template-parser@21.4.0': resolution: {integrity: sha512-BaUSLSyS+43fzDoJkTMkGqNdCXq3fGnUZsfXTmrlZPJf5AYFbgAlAPGZXDJyoNWw43fux+DafdlrlKcYUSgSIw==} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '*' + '@angular-eslint/utils@21.2.0': + resolution: {integrity: sha512-E19/hkuvHoNFvctBkmEiGWpy2bbC6cgbr3GNVrn2nGtbI4jnwnDFCGHv50I4LBfvj0PA9E6TWe73ejJ5qoMJWQ==} + peerDependencies: + '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + '@angular-eslint/utils@21.4.0': resolution: {integrity: sha512-7pi+Ga7QmdH5Ig/diau6fR5L4yubgKr9TOjdCg7OeuE/zo0O3osTCNT6JOodzS/iQM1kSCJFDoIBKFeUOttiNw==} peerDependencies: @@ -516,7 +505,6 @@ packages: '@angular/animations@21.2.9': resolution: {integrity: sha512-wOWbrneivpTYx3xhiPygoNFNC8ZZ1shpgwBe1hYvfky1fkiz1c92XeHIW1V4rPqYw6d3U55aUX5InyTsVe2Xng==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - deprecated: '@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.' peerDependencies: '@angular/core': 21.2.9 @@ -579,11 +567,11 @@ packages: engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular/common@21.2.17': - resolution: {integrity: sha512-hqAQxRfi5ldFE42suAXRcY+JCANrUh7fuSQ/DtZ7L896id5BT/exuv6dWNBC1PyAfQmRbpD5Pt6/pd+tNLyhDQ==} + '@angular/common@21.2.9': + resolution: {integrity: sha512-7spQcF3hPN/fjTx6Pwa32KRRdO0NcixnRuPV4lo50ejtXesjiLVR+fkaX38sawAyGoq89IuuYvUDrbLwCMypmQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 21.2.17 + '@angular/core': 21.2.9 rxjs: ^6.5.3 || ^7.4.0 '@angular/compiler-cli@21.2.9': @@ -597,15 +585,15 @@ packages: typescript: optional: true - '@angular/compiler@21.2.17': - resolution: {integrity: sha512-p+NdjYiwAz9Zmu2yul0LlMXaFjMISVVa24+/MVMoKFeQeI82QE8jDywPlnOSHQHvdCcQVpS7saeEriZzX3JuBQ==} + '@angular/compiler@21.2.9': + resolution: {integrity: sha512-clsK1EsSPtAuqlRl4CciA/gsvsW7xe0eWcvHxtrMW6DYaUJ6X4AAuDxEEJ5cf/3Mpw4s8KssjIUPPtbrUIGLSQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@angular/core@21.2.17': - resolution: {integrity: sha512-wYHpwIdnUnjQFOJJNqRcGx7LS3u64jT+R9L0TnMR/ViBM9dQgGYImlSikkftg2yrFCNo5aKRxhG2LLskQurVdg==} + '@angular/core@21.2.9': + resolution: {integrity: sha512-uZLq2aedJ+0uEZxyf6a1Nc7y1aZ7akAW7K1Kon8JUDZOvI2IDbk0i00MzkELt8q9uSmSSqg9zNKuhjspFf0Pyw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/compiler': 21.2.17 + '@angular/compiler': 21.2.9 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -647,7 +635,6 @@ packages: '@angular/platform-browser-dynamic@21.2.9': resolution: {integrity: sha512-Z+2vefW4GUSuTC4BOKNiyftqecLSjxOKwe1ZNljBsjesLzywIXi+v+tyEm8ODHHlf7bz/0HwXvc9OYZmfjt95A==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - deprecated: '@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead.' peerDependencies: '@angular/common': 21.2.9 '@angular/compiler': 21.2.9 @@ -674,49 +661,25 @@ packages: '@angular/platform-browser': 21.2.9 rxjs: ^6.5.3 || ^7.4.0 - '@asamuzakjp/css-color@5.1.11': - resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/dom-selector@7.1.1': - resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/generational-cache@1.0.1': - resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/nwsapi@2.3.9': - resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.3': resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -725,35 +688,27 @@ packages: resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.29.3': resolution: {integrity: sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/helper-create-regexp-features-plugin@7.28.5': resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/helper-define-polyfill-provider@0.6.8': resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} @@ -762,21 +717,11 @@ packages: resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 - - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/helper-optimise-call-expression@7.27.1': resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} @@ -790,13 +735,13 @@ packages: resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/helper-replace-supers@7.28.6': resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/helper-skip-transparent-expression-wrappers@7.27.1': resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} @@ -810,32 +755,20 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.28.6': resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} '@babel/parser@7.29.3': @@ -843,508 +776,503 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3': resolution: {integrity: sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.13.0 '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-proposal-decorators@7.29.0': resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-bigint@7.8.3': resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-static-block@7.14.5': resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-decorators@7.28.6': resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-assertions@7.28.6': resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.28.6': resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-json-strings@7.8.3': resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.28.6': resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-numeric-separator@7.10.4': resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-object-rest-spread@7.8.3': resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-catch-binding@7.8.3': resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-top-level-await@7.14.5': resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.28.6': resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-transform-arrow-functions@7.27.1': resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-generator-functions@7.29.0': resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-to-generator@7.28.6': resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoped-functions@7.27.1': resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoping@7.28.6': resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-properties@7.28.6': resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-static-block@7.28.6': resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.12.0 '@babel/plugin-transform-classes@7.28.6': resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-computed-properties@7.28.6': resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-destructuring@7.28.5': resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-dotall-regex@7.28.6': resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-keys@7.27.1': resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-transform-dynamic-import@7.27.1': resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-explicit-resource-management@7.28.6': resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-exponentiation-operator@7.28.6': resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-export-namespace-from@7.27.1': resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-for-of@7.27.1': resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-function-name@7.27.1': resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-json-strings@7.28.6': resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-literals@7.27.1': resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-logical-assignment-operators@7.28.6': resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-member-expression-literals@7.27.1': resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-amd@7.27.1': resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-commonjs@7.28.6': resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-systemjs@7.29.4': resolution: {integrity: sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-umd@7.27.1': resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-transform-new-target@7.27.1': resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-numeric-separator@7.28.6': resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-rest-spread@7.28.6': resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-super@7.27.1': resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-catch-binding@7.28.6': resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-chaining@7.28.6': resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-parameters@7.27.7': resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-methods@7.28.6': resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-property-in-object@7.28.6': resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-property-literals@7.27.1': resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regenerator@7.29.0': resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regexp-modifiers@7.28.6': resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/plugin-transform-reserved-words@7.27.1': resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-runtime@7.29.0': resolution: {integrity: sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-shorthand-properties@7.27.1': resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-spread@7.28.6': resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-sticky-regex@7.27.1': resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-template-literals@7.27.1': resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typeof-symbol@7.27.1': resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typescript@7.28.6': resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-escapes@7.27.1': resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-property-regex@7.28.6': resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-regex@7.27.1': resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-sets-regex@7.28.6': resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 '@babel/preset-env@7.29.2': resolution: {integrity: sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/preset-env@7.29.5': resolution: {integrity: sha512-/69t2aEzGKHD76DyLbHysF/QH2LJOB8iFnYO37unDTKBTubzcMRv0f3H5EiN1Q6ajOd/eB7dAInF0qdFVS06kA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 '@babel/preset-typescript@7.28.5': resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 '@babel/runtime-corejs3@7.29.2': resolution: {integrity: sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==} @@ -1358,33 +1286,17 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} - engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@bramus/specificity@2.4.2': - resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} - hasBin: true - '@bufbuild/protobuf@2.12.0': resolution: {integrity: sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==} @@ -1464,41 +1376,33 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@csstools/color-helpers@6.1.0': - resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} - engines: {node: '>=20.19.0'} - - '@csstools/css-calc@3.2.1': - resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} - '@csstools/css-color-parser@4.1.9': - resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} - engines: {node: '>=20.19.0'} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-parser-algorithms@4.0.0': - resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} - engines: {node: '>=20.19.0'} + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.1.6': - resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} peerDependencies: - css-tree: ^3.2.1 - peerDependenciesMeta: - css-tree: - optional: true + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-tokenizer@4.0.0': - resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} - engines: {node: '>=20.19.0'} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} '@cypress/request@3.0.10': resolution: {integrity: sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==} @@ -1529,161 +1433,473 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.28.1': - resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.28.1': - resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.28.1': - resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.28.1': - resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.28.1': - resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.28.1': - resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.1': - resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.28.1': - resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.28.1': - resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.28.1': - resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.28.1': - resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.28.1': - resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.28.1': - resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.28.1': - resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.28.1': - resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.28.1': - resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.1': - resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.1': - resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.1': - resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} engines: {node: '>=18'} cpu: [arm64] - os: [openbsd] + os: [netbsd] - '@esbuild/openbsd-x64@0.28.1': - resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] - os: [openbsd] + os: [netbsd] - '@esbuild/openharmony-arm64@0.28.1': - resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] + cpu: [x64] + os: [netbsd] - '@esbuild/sunos-x64@0.28.1': - resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} engines: {node: '>=18'} cpu: [x64] - os: [sunos] + os: [netbsd] - '@esbuild/win32-arm64@0.28.1': - resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] - os: [win32] + os: [openbsd] - '@esbuild/win32-ia32@0.28.1': - resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} - cpu: [ia32] - os: [win32] + cpu: [arm64] + os: [openbsd] - '@esbuild/win32-x64@0.28.1': - resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} engines: {node: '>=18'} - cpu: [x64] - os: [win32] + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} @@ -1695,43 +1911,37 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@10.0.1': - resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: ^10.0.0 - peerDependenciesMeta: - eslint: - optional: true + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.7.2': - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@exodus/bytes@1.15.1': - resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - '@noble/hashes': ^1.8.0 || ^2.0.0 - peerDependenciesMeta: - '@noble/hashes': - optional: true + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} '@gar/promise-retry@1.0.3': resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} @@ -1744,7 +1954,7 @@ packages: resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} engines: {node: '>=18.14.1'} peerDependencies: - hono: ^4.12.25 + hono: ^4 '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} @@ -1766,6 +1976,10 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@hutson/parse-repository-url@5.0.0': + resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} + engines: {node: '>=10.13.0'} + '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} @@ -1916,10 +2130,27 @@ packages: resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} engines: {node: '>=8'} + '@jest/console@30.0.0': + resolution: {integrity: sha512-vfpJap6JZQ3I8sUN8dsFqNAKJYO4KIGxkcB+3Fw7Q/BJiWY5HwtMMiuT1oP0avsiDhjE/TCLaDgbGfHwDdBVeg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/console@30.4.1': resolution: {integrity: sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/core@30.0.0': + resolution: {integrity: sha512-1zU39zFtWSl5ZuDK3Rd6P8S28MmS4F11x6Z4CURrgJ99iaAJg68hmdJ2SAHEEO6ociaNk43UhUYtHxWKEWoNYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/diff-sequences@30.0.0': + resolution: {integrity: sha512-xMbtoCeKJDto86GW6AiwVv7M4QAuI56R7dVBr1RNGYbOT44M2TIzOiske2RxopBqkumDY+A1H55pGvuribRY9A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.0.1': resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1928,26 +2159,78 @@ packages: resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment-jsdom-abstract@30.0.0': + resolution: {integrity: sha512-Fcn1eZbH1JK+bqwUVkUVprlQL3xWUrhvOe/4L0PfDkaJOiAz3HUI1m4s0bgmXBYyCyTVogBuUFZkRpAKMox5Dw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + jsdom: '*' + peerDependenciesMeta: + canvas: + optional: true + + '@jest/environment-jsdom-abstract@30.4.1': + resolution: {integrity: sha512-dSlKrqug3siYNHVnjwIldShY12wAH3spwRltO/+8VOjg0X+xEq7vOs3DbBs4LRKsu7OH+NUb9kuZUNBF9Ho3TA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + jsdom: '*' + peerDependenciesMeta: + canvas: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/environment@30.0.0': + resolution: {integrity: sha512-09sFbMMgS5JxYnvgmmtwIHhvoyzvR5fUPrVl8nOCrC5KdzmmErTcAxfWyAhJ2bv3rvHNQaKiS+COSG+O7oNbXw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@30.4.1': resolution: {integrity: sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@30.0.0': + resolution: {integrity: sha512-UiWfsqNi/+d7xepfOv8KDcbbzcYtkWBe3a3kVDtg6M1kuN6CJ7b4HzIp5e1YHrSaQaVS8sdCoyCMCZClTLNKFQ==} + 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/expect@30.0.0': + resolution: {integrity: sha512-XZ3j6syhMeKiBknmmc8V3mNIb44kxLTbOQtaXA4IFdHy+vEN0cnXRzbRjdGBtrp4k1PWyMWNU3Fjz3iejrhpQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect@30.4.1': resolution: {integrity: sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@30.0.0': + resolution: {integrity: sha512-yzBmJcrMHAMcAEbV2w1kbxmx8WFpEz8Cth3wjLMSkq+LO8VeGKRhpr5+BUp7PPK+x4njq/b6mVnDR8e/tPL5ng==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@30.4.1': resolution: {integrity: sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.0.0': + resolution: {integrity: sha512-VZWMjrBzqfDKngQ7sUctKeLxanAbsBFoZnPxNIG6CmxK7Gv6K44yqd0nzveNIBfuhGZMmk1n5PGbvdSTOu0yTg==} + 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/globals@30.0.0': + resolution: {integrity: sha512-OEzYes5A1xwBJVMPqFRa8NCao8Vr42nsUZuf/SpaJWoLE+4kyl6nCQZ1zqfipmCrIXQVALC5qJwKy/7NQQLPhw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/globals@30.4.1': resolution: {integrity: sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1960,6 +2243,15 @@ packages: resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/reporters@30.0.0': + resolution: {integrity: sha512-5WHNlLO0Ok+/o6ML5IzgVm1qyERtLHBNhwn67PAq92H4hZ+n5uW/BYj1VVwmTdxIcNrZLxdV9qtpdZkXf16HxA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + '@jest/reporters@30.4.1': resolution: {integrity: sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1969,6 +2261,10 @@ packages: node-notifier: optional: true + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.0.0': resolution: {integrity: sha512-NID2VRyaEkevCRz6badhfqYwri/RvMbiHY81rk3AkK/LaiB0LSxi1RdVZ7MpZdTjNugtZeGfpL0mLs9Kp3MrQw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1977,26 +2273,50 @@ packages: resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/snapshot-utils@30.0.0': + resolution: {integrity: sha512-C/QSFUmvZEYptg2Vin84FggAphwHvj6la39vkw1CNOZQORWZ7O/H0BXmdeeeGnvlXDYY8TlFM5jgFnxLAxpFjA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/snapshot-utils@30.4.1': resolution: {integrity: sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/source-map@30.0.0': + resolution: {integrity: sha512-oYBJ4d/NF4ZY3/7iq1VaeoERHRvlwKtrGClgescaXMIa1mmb+vfJd0xMgbW9yrI80IUA7qGbxpBWxlITrHkWoA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-result@30.0.0': + resolution: {integrity: sha512-685zco9HdgBaaWiB9T4xjLtBuN0Q795wgaQPpmuAeZPHwHZSoKFAUnozUtU+ongfi4l5VCz8AclOE5LAQdyjxQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-result@30.4.1': resolution: {integrity: sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-sequencer@30.0.0': + resolution: {integrity: sha512-Hmvv5Yg6UmghXIcVZIydkT0nAK7M/hlXx9WMHR5cLVwdmc14/qUQt3mC72T6GN0olPC6DhmKE6Cd/pHsgDbuqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/test-sequencer@30.4.1': resolution: {integrity: sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/transform@30.0.0': + resolution: {integrity: sha512-8xhpsCGYJsUjqpJOgLyMkeOSSlhqggFZEWAnZquBsvATtueoEs7CkMRxOUmJliF3E5x+mXmZ7gEEsHank029Og==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/transform@30.4.1': resolution: {integrity: sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@30.0.0': resolution: {integrity: sha512-1Nox8mAL52PKPfEnUQWBvKU/bp8FTT6AiDu76bFDEJj/qsRFSAVSldfCH3XYMqialti2zHXKvD5gN0AaHc0yKA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2027,6 +2347,11 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jscutlery/semver@5.8.1': + resolution: {integrity: sha512-4d+lScLwpMJuKGs1CccCD9DmN82WaPmgBe9ynwSUCYLwEECyHt+AHJC/7ssFI/Ck0hZiKUsy5oKWqtJ4IYNcyg==} + peerDependencies: + '@nx/devkit': ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 + '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -2709,26 +3034,6 @@ packages: '@module-federation/enhanced': ^2.3.3 '@module-federation/node': ^2.7.21 - '@nx/vite@22.7.3': - resolution: {integrity: sha512-egp3TUkJdek3Xbv9HCk3B7o5OBcnGeajHrs3EH/hvR7NCItIu/yR+nUg8R0N6y6lzeE4hI0iMO3gSHpOirXfOg==} - peerDependencies: - vite: ^7.3.5 - vitest: ^1.3.1 || ^2.0.0 || ^3.0.0 || ^4.0.0 - - '@nx/vitest@22.7.3': - resolution: {integrity: sha512-i8tHAvt44QGozPPhi1s5F8sJlqb091GBLJQPN4AjXw5EDR2b4JaIiWTj7DYS82TXM7PS53YqS7aiHvPS8qCC+Q==} - peerDependencies: - '@nx/eslint': 22.7.3 - vite: ^7.3.5 - vitest: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - peerDependenciesMeta: - '@nx/eslint': - optional: true - vite: - optional: true - vitest: - optional: true - '@nx/web@22.7.3': resolution: {integrity: sha512-TsVM6PT/Hputr/QT87bkvRj7wRI2LN3Wlm6DQkxMt3dGZWR+deSjUX8/Q6qDC+Ted+ZiP/msgKvj1QNiXszq/g==} peerDependencies: @@ -2809,256 +3114,126 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@oxc-parser/binding-android-arm-eabi@0.121.0': - resolution: {integrity: sha512-n07FQcySwOlzap424/PLMtOkbS7xOu8nsJduKL8P3COGHKgKoDYXwoAHCbChfgFpHnviehrLWIPX0lKGtbEk/A==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-project/types@0.113.0': + resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} + + '@oxc-resolver/binding-android-arm-eabi@11.19.1': + resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.121.0': - resolution: {integrity: sha512-/Dd1xIXboYAicw+twT2utxPD7bL8qh7d3ej0qvaYIMj3/EgIrGR+tSnjCUkiCT6g6uTC0neSS4JY8LxhdSU/sA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-android-arm64@11.19.1': + resolution: {integrity: sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.121.0': - resolution: {integrity: sha512-A0jNEvv7QMtCO1yk205t3DWU9sWUjQ2KNF0hSVO5W9R9r/R1BIvzG01UQAfmtC0dQm7sCrs5puixurKSfr2bRQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-darwin-arm64@11.19.1': + resolution: {integrity: sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.121.0': - resolution: {integrity: sha512-SsHzipdxTKUs3I9EOAPmnIimEeJOemqRlRDOp9LIj+96wtxZejF51gNibmoGq8KoqbT1ssAI5po/E3J+vEtXGA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-darwin-x64@11.19.1': + resolution: {integrity: sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.121.0': - resolution: {integrity: sha512-v1APOTkCp+RWOIDAHRoaeW/UoaHF15a60E8eUL6kUQXh+i4K7PBwq2Wi7jm8p0ymID5/m/oC1w3W31Z/+r7HQw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-freebsd-x64@11.19.1': + resolution: {integrity: sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': - resolution: {integrity: sha512-PmqPQuqHZyFVWA4ycr0eu4VnTMmq9laOHZd+8R359w6kzuNZPvmmunmNJ8ybkm769A0nCoVp3TJ6dUz7B3FYIQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': + resolution: {integrity: sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': - resolution: {integrity: sha512-vF24htj+MOH+Q7y9A8NuC6pUZu8t/C2Fr/kDOi2OcNf28oogr2xadBPXAbml802E8wRAVfbta6YLDQTearz+jw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': + resolution: {integrity: sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.121.0': - resolution: {integrity: sha512-wjH8cIG2Lu/3d64iZpbYr73hREMgKAfu7fqpXjgM2S16y2zhTfDIp8EQjxO8vlDtKP5Rc7waZW72lh8nZtWrpA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': + resolution: {integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-musl@0.121.0': - resolution: {integrity: sha512-qT663J/W8yQFw3dtscbEi9LKJevr20V7uWs2MPGTnvNZ3rm8anhhE16gXGpxDOHeg9raySaSHKhd4IGa3YZvuw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-arm64-musl@11.19.1': + resolution: {integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': - resolution: {integrity: sha512-mYNe4NhVvDBbPkAP8JaVS8lC1dsoJZWH5WCjpw5E+sjhk1R08wt3NnXYUzum7tIiWPfgQxbCMcoxgeemFASbRw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': + resolution: {integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': - resolution: {integrity: sha512-+QiFoGxhAbaI/amqX567784cDyyuZIpinBrJNxUzb+/L2aBRX67mN6Jv40pqduHf15yYByI+K5gUEygCuv0z9w==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': + resolution: {integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-musl@0.121.0': - resolution: {integrity: sha512-9ykEgyTa5JD/Uhv2sttbKnCfl2PieUfOjyxJC/oDL2UO0qtXOtjPLl7H8Kaj5G7p3hIvFgu3YWvAxvE0sqY+hQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': + resolution: {integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-parser/binding-linux-s390x-gnu@0.121.0': - resolution: {integrity: sha512-DB1EW5VHZdc1lIRjOI3bW/wV6R6y0xlfvdVrqj6kKi7Ayu2U3UqUBdq9KviVkcUGd5Oq+dROqvUEEFRXGAM7EQ==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': + resolution: {integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.121.0': - resolution: {integrity: sha512-s4lfobX9p4kPTclvMiH3gcQUd88VlnkMTF6n2MTMDAyX5FPNRhhRSFZK05Ykhf8Zy5NibV4PbGR6DnK7FGNN6A==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-x64-gnu@11.19.1': + resolution: {integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-musl@0.121.0': - resolution: {integrity: sha512-P9KlyTpuBuMi3NRGpJO8MicuGZfOoqZVRP1WjOecwx8yk4L/+mrCRNc5egSi0byhuReblBF2oVoDSMgV9Bj4Hw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-linux-x64-musl@11.19.1': + resolution: {integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==} cpu: [x64] os: [linux] libc: [musl] - '@oxc-parser/binding-openharmony-arm64@0.121.0': - resolution: {integrity: sha512-R+4jrWOfF2OAPPhj3Eb3U5CaKNAH9/btMveMULIrcNW/hjfysFQlF8wE0GaVBr81dWz8JLgQlsxwctoL78JwXw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-openharmony-arm64@11.19.1': + resolution: {integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.121.0': - resolution: {integrity: sha512-5TFISkPTymKvsmIlKasPVTPuWxzCcrT8pM+p77+mtQbIZDd1UC8zww4CJcRI46kolmgrEX6QpKO8AvWMVZ+ifw==} + '@oxc-resolver/binding-wasm32-wasi@11.19.1': + resolution: {integrity: sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.121.0': - resolution: {integrity: sha512-V0pxh4mql4XTt3aiEtRNUeBAUFOw5jzZNxPABLaOKAWrVzSr9+XUaB095lY7jqMf5t8vkfh8NManGB28zanYKw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': + resolution: {integrity: sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.121.0': - resolution: {integrity: sha512-4Ob1qvYMPnlF2N9rdmKdkQFdrq16QVcQwBsO8yiPZXof0fHKFF+LmQV501XFbi7lHyrKm8rlJRfQ/M8bZZPVLw==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': + resolution: {integrity: sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.121.0': - resolution: {integrity: sha512-BOp1KCzdboB1tPqoCPXgntgFs0jjeSyOXHzgxVFR7B/qfr3F8r4YDacHkTOUNXtDgM8YwKnkf3rE5gwALYX7NA==} - engines: {node: ^20.19.0 || >=22.12.0} + '@oxc-resolver/binding-win32-x64-msvc@11.19.1': + resolution: {integrity: sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==} cpu: [x64] os: [win32] - '@oxc-project/types@0.113.0': - resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} - - '@oxc-project/types@0.121.0': - resolution: {integrity: sha512-CGtOARQb9tyv7ECgdAlFxi0Fv7lmzvmlm2rpD/RdijOO9rfk/JvB1CjT8EnoD+tjna/IYgKKw3IV7objRb+aYw==} - - '@oxc-resolver/binding-android-arm-eabi@11.19.1': - resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} - cpu: [arm] - os: [android] - - '@oxc-resolver/binding-android-arm64@11.19.1': - resolution: {integrity: sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.19.1': - resolution: {integrity: sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==} - cpu: [arm64] - os: [darwin] - - '@oxc-resolver/binding-darwin-x64@11.19.1': - resolution: {integrity: sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==} - cpu: [x64] - os: [darwin] - - '@oxc-resolver/binding-freebsd-x64@11.19.1': - resolution: {integrity: sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==} - cpu: [x64] - os: [freebsd] - - '@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1': - resolution: {integrity: sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm-musleabihf@11.19.1': - resolution: {integrity: sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-gnu@11.19.1': - resolution: {integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-arm64-musl@11.19.1': - resolution: {integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@oxc-resolver/binding-linux-ppc64-gnu@11.19.1': - resolution: {integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-riscv64-gnu@11.19.1': - resolution: {integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-riscv64-musl@11.19.1': - resolution: {integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@oxc-resolver/binding-linux-s390x-gnu@11.19.1': - resolution: {integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-x64-gnu@11.19.1': - resolution: {integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@oxc-resolver/binding-linux-x64-musl@11.19.1': - resolution: {integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@oxc-resolver/binding-openharmony-arm64@11.19.1': - resolution: {integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==} - cpu: [arm64] - os: [openharmony] - - '@oxc-resolver/binding-wasm32-wasi@11.19.1': - resolution: {integrity: sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': - resolution: {integrity: sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==} - cpu: [arm64] - os: [win32] - - '@oxc-resolver/binding-win32-ia32-msvc@11.19.1': - resolution: {integrity: sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==} - cpu: [ia32] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@11.19.1': - resolution: {integrity: sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==} - cpu: [x64] - os: [win32] - - '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - - '@parcel/watcher-darwin-arm64@2.5.6': - resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} - engines: {node: '>= 10.0.0'} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] @@ -3622,12 +3797,21 @@ packages: resolution: {integrity: sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==} engines: {node: ^20.17.0 || >=22.9.0} + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + '@sinclair/typebox@0.34.49': resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + '@sinonjs/fake-timers@15.4.0': resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} @@ -3732,9 +3916,6 @@ packages: '@swc/types@0.1.26': resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} - '@ts-morph/common@0.22.0': - resolution: {integrity: sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==} - '@tsconfig/node10@1.0.12': resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} @@ -3779,9 +3960,6 @@ packages: '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/connect-history-api-fallback@1.5.4': resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} @@ -3791,9 +3969,6 @@ packages: '@types/conventional-commits-parser@5.0.2': resolution: {integrity: sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g==} - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -3839,6 +4014,12 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3851,8 +4032,8 @@ packages: '@types/node@22.19.19': resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} - '@types/node@22.20.0': - resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3896,6 +4077,9 @@ packages: '@types/tmp@0.2.6': resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -3908,40 +4092,71 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.61.0': - resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} + '@typescript-eslint/eslint-plugin@8.40.0': + resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.40.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/eslint-plugin@8.60.0': + resolution: {integrity: sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.61.0 + '@typescript-eslint/parser': ^8.60.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.61.0': - resolution: {integrity: sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==} + '@typescript-eslint/parser@8.40.0': + resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.60.0': + resolution: {integrity: sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.40.0': + resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.59.4': resolution: {integrity: sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.61.0': - resolution: {integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==} + '@typescript-eslint/project-service@8.60.0': + resolution: {integrity: sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@8.40.0': + resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.59.4': resolution: {integrity: sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.61.0': - resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==} + '@typescript-eslint/scope-manager@8.60.0': + resolution: {integrity: sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.40.0': + resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/tsconfig-utils@8.59.4': resolution: {integrity: sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==} @@ -3949,12 +4164,19 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/tsconfig-utils@8.61.0': - resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==} + '@typescript-eslint/tsconfig-utils@8.60.0': + resolution: {integrity: sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/type-utils@8.40.0': + resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.59.4': resolution: {integrity: sha512-uonTuPAAKr9XaBGqJ3LjYTh72zy5DyGesljO9gtmk/eFW0W1fRHjnwVYKB35Lm8d5Q5CluEW3gPHjTvZTmgrfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3962,20 +4184,30 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.61.0': - resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==} + '@typescript-eslint/type-utils@8.60.0': + resolution: {integrity: sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/types@8.40.0': + resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.59.4': resolution: {integrity: sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.61.0': - resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==} + '@typescript-eslint/types@8.60.0': + resolution: {integrity: sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.40.0': + resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/typescript-estree@8.59.4': resolution: {integrity: sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==} @@ -3983,12 +4215,19 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/typescript-estree@8.61.0': - resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==} + '@typescript-eslint/typescript-estree@8.60.0': + resolution: {integrity: sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.40.0': + resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.59.4': resolution: {integrity: sha512-cYXeNAUsG4lJo5dbc1FcKm+JwIWrj1/UpTORsC6tGMjEZ81DYcvIr9/ueikhMa/Y/gDQYGp+YX9/xQrXje5BJw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3996,19 +4235,23 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.61.0': - resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==} + '@typescript-eslint/utils@8.60.0': + resolution: {integrity: sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@8.40.0': + resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.59.4': resolution: {integrity: sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.61.0': - resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} + '@typescript-eslint/visitor-keys@8.60.0': + resolution: {integrity: sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.1': @@ -4138,36 +4381,7 @@ packages: resolution: {integrity: sha512-HXciTXN/sDBYWgeAD4V4s0DN0g72x5mlxQhHxtYu3Tt8BLa6MzcJZUyDVFCdtjNs3bfENVHVzOsmooTVuNgAAw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: - vite: ^7.3.5 - - '@vitest/expect@4.1.9': - resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - - '@vitest/mocker@4.1.9': - resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} - peerDependencies: - msw: ^2.4.9 - vite: ^7.3.5 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@4.1.9': - resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - - '@vitest/runner@4.1.9': - resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - - '@vitest/snapshot@4.1.9': - resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - - '@vitest/spy@4.1.9': - resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - - '@vitest/utils@4.1.9': - resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + vite: ^6.0.0 || ^7.0.0 '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -4263,6 +4477,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + address@2.0.3: resolution: {integrity: sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==} engines: {node: '>= 16.0.0'} @@ -4421,10 +4638,6 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -4466,35 +4679,45 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-jest@30.0.0: + resolution: {integrity: sha512-JQ0DhdFjODbSawDf0026uZuwaqfKkQzk+9mwWkq2XkKFIaMhFVOxlVmbFCOnnC76jATdxrff3IiUAvOAJec6tw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + babel-jest@30.4.1: resolution: {integrity: sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.11.0 || ^8.0.0-0 babel-loader@10.0.0: resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.12.0 webpack: '>=5.61.0' babel-loader@9.2.1: resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} engines: {node: '>= 14.15.0'} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.12.0 webpack: '>=5' babel-plugin-const-enum@1.2.0: resolution: {integrity: sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0-0 babel-plugin-istanbul@7.0.1: resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} engines: {node: '>=12'} + babel-plugin-jest-hoist@30.0.0: + resolution: {integrity: sha512-DSRm+US/FCB4xPDD6Rnslb6PAF9Bej1DZ+1u4aTiqJnk7ZX12eHsnDiIOqjGvITCq+u6wLqUhgS+faCNbVY8+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + babel-plugin-jest-hoist@30.4.0: resolution: {integrity: sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4506,27 +4729,27 @@ packages: babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-corejs3@0.13.0: resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-corejs3@0.14.2: resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-regenerator@0.6.8: resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-transform-typescript-metadata@0.3.2: resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7 '@babel/traverse': ^7 peerDependenciesMeta: '@babel/traverse': @@ -4535,13 +4758,19 @@ packages: babel-preset-current-node-syntax@1.2.0: resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-jest@30.0.0: + resolution: {integrity: sha512-hgEuu/W7gk8QOWUA9+m3Zk+WpGvKc1Egp6rFQEfYxEoM9Fk/q8nuTXNL65OkhwGrTApauEGgakOoWVXj+UfhKw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 babel-preset-jest@30.4.0: resolution: {integrity: sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.29.6 + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -4579,9 +4808,6 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -4635,6 +4861,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} @@ -4703,10 +4933,6 @@ packages: caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} - engines: {node: '>=18'} - chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -4749,6 +4975,10 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -4824,9 +5054,6 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - code-block-writer@12.0.0: - resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} - collect-v8-coverage@1.0.3: resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} @@ -4933,18 +5160,72 @@ packages: resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} engines: {node: '>=16'} + conventional-changelog-atom@4.0.0: + resolution: {integrity: sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==} + engines: {node: '>=16'} + + conventional-changelog-codemirror@4.0.0: + resolution: {integrity: sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==} + engines: {node: '>=16'} + conventional-changelog-conventionalcommits@7.0.2: resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} engines: {node: '>=16'} + conventional-changelog-core@7.0.0: + resolution: {integrity: sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==} + engines: {node: '>=16'} + + conventional-changelog-ember@4.0.0: + resolution: {integrity: sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==} + engines: {node: '>=16'} + + conventional-changelog-eslint@5.0.0: + resolution: {integrity: sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==} + engines: {node: '>=16'} + + conventional-changelog-express@4.0.0: + resolution: {integrity: sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==} + engines: {node: '>=16'} + + conventional-changelog-jquery@5.0.0: + resolution: {integrity: sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==} + engines: {node: '>=16'} + + conventional-changelog-jshint@4.0.0: + resolution: {integrity: sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==} + engines: {node: '>=16'} + + conventional-changelog-preset-loader@4.1.0: + resolution: {integrity: sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==} + engines: {node: '>=16'} + + conventional-changelog-writer@7.0.1: + resolution: {integrity: sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==} + engines: {node: '>=16'} + hasBin: true + + conventional-changelog@5.1.0: + resolution: {integrity: sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg==} + engines: {node: '>=16'} + conventional-commit-types@3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + conventional-commits-filter@4.0.0: + resolution: {integrity: sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==} + engines: {node: '>=16'} + conventional-commits-parser@5.0.0: resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} engines: {node: '>=16'} hasBin: true + conventional-recommended-bump@9.0.0: + resolution: {integrity: sha512-HR1yD0G5HgYAu6K0wJjLd7QGRK8MQDqqj6Tn1n/ja1dFwBCE6QmV+iSgQ5F7hkx7OUR/8bHpxJqYtXj2f/opPQ==} + engines: {node: '>=16'} + hasBin: true + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -5143,6 +5424,10 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + csv-parse@5.6.0: resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} @@ -5166,12 +5451,12 @@ packages: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} - data-urls@7.0.0: - resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} - dayjs@1.11.21: - resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -5462,8 +5747,23 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.28.1: - resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + esbuild-wasm@0.28.0: + resolution: {integrity: sha512-5TRVKExcEmeMkccIZMzUq+Az6X2RoMAJyfl6SMMO1dMVhmvt0I2mx7gAb6zYi42n4d1ETcatFXazGKzA+aW7fg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} hasBin: true @@ -5486,8 +5786,9 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + eslint-config-prettier@10.0.0: + resolution: {integrity: sha512-afC6TrbQrqf5rKYMehz63fGtQZgulxTKggRAutlra4His1FZcf0PEZCKTM7DlCaZqoQC45BFZmj7wR/qvJHg3g==} + deprecated: wrong version missing main field hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -5496,6 +5797,10 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -5504,13 +5809,17 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.4.1: - resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -5518,9 +5827,9 @@ packages: jiti: optional: true - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -5550,9 +5859,6 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -5586,6 +5892,10 @@ packages: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} engines: {node: '>=10'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + executable@4.1.1: resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} engines: {node: '>=4'} @@ -5598,9 +5908,9 @@ packages: resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} engines: {node: '>=0.10.0'} - expect-type@1.4.0: - resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} - engines: {node: '>=12.0.0'} + expect@30.0.0: + resolution: {integrity: sha512-xCdPp6gwiR9q9lsPCHANarIkFTN/IMZso6Kkq03sOm9IIGtzK/UJqml0dkhHibGh8HKOj8BIDIpZ0BZuU7QK6w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} expect@30.4.1: resolution: {integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==} @@ -5777,8 +6087,8 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 - form-data@4.0.6: - resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} forwarded@0.2.0: @@ -5855,6 +6165,10 @@ packages: 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'} + getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} @@ -5864,6 +6178,12 @@ packages: deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. hasBin: true + git-semver-tags@7.0.1: + resolution: {integrity: sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==} + engines: {node: '>=16'} + deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. + hasBin: true + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -5910,13 +6230,14 @@ packages: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + globals@17.6.0: resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -5924,6 +6245,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -5963,10 +6287,6 @@ packages: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} - he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -5975,10 +6295,14 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hono@4.12.27: - resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} + hono@4.12.22: + resolution: {integrity: sha512-7fvVPbB92zNRsQke+uiRGwtTuef0tB2Dg4hWxYfFNvkQhIltWoyi0ONReM5LWA+jJWS3nfT5lTq+qbsIpX0IQw==} engines: {node: '>=16.9.0'} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@9.0.3: resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} engines: {node: ^20.17.0 || >=22.9.0} @@ -5990,9 +6314,9 @@ packages: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} - html-encoding-sniffer@6.0.0: - resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -6041,8 +6365,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-proxy-middleware@2.0.10: - resolution: {integrity: sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==} + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} engines: {node: '>=12.0.0'} peerDependencies: '@types/express': ^4.17.13 @@ -6050,9 +6374,9 @@ packages: '@types/express': optional: true - http-proxy-middleware@3.0.7: - resolution: {integrity: sha512-iwbQltVlx8bCrqePUM8C+hllHvdawVhQJaLrj1X7qllkvFQdXFsr16pW/mo9+JDVjN+QO2XUx9jd8SmoFkE5qw==} - engines: {node: ^14.18.0 || ^16.10.0 || >=18.0.0} + http-proxy-middleware@3.0.5: + resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} @@ -6075,6 +6399,10 @@ packages: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -6133,6 +6461,11 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} @@ -6173,6 +6506,10 @@ packages: resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} + inquirer@8.2.7: + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} + engines: {node: '>=12.0.0'} + ip-address@10.2.0: resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} engines: {node: '>= 12'} @@ -6367,57 +6704,147 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-changed-files@30.0.0: + resolution: {integrity: sha512-rzGpvCdPdEV1Ma83c1GbZif0L2KAm3vXSXGRlpx7yCt0vhruwCNouKNRh3SiVcISHP1mb3iJzjb7tAEnNu1laQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.0.0: + resolution: {integrity: sha512-nTwah78qcKVyndBS650hAkaEmwWGaVsMMoWdJwMnH77XArRJow2Ir7hc+8p/mATtxVZuM9OTkA/3hQocRIK5Dw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-circus@30.4.2: resolution: {integrity: sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-config@30.4.2: - resolution: {integrity: sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==} + jest-cli@30.0.0: + resolution: {integrity: sha512-fWKAgrhlwVVCfeizsmIrPRTBYTzO82WSba3gJniZNR3PKXADgdC0mmCSK+M+t7N8RCXOVfY6kvCkvjUNtzmHYQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true peerDependencies: - '@types/node': '*' - esbuild-register: '>=3.4.0' - ts-node: '>=9.0.0' + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: - '@types/node': + node-notifier: + optional: true + + jest-config@30.0.0: + resolution: {integrity: sha512-p13a/zun+sbOMrBnTEUdq/5N7bZMOGd1yMfqtAJniPNuzURMay4I+vxZLK1XSDbjvIhmeVdG8h8RznqYyjctyg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-config@30.4.2: + resolution: {integrity: sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': optional: true esbuild-register: optional: true ts-node: optional: true + jest-diff@30.0.0: + resolution: {integrity: sha512-TgT1+KipV8JTLXXeFX0qSvIJR/UXiNNojjxb/awh3vYlBZyChU/NEmyKmq+wijKjWEztyrGJFL790nqMqNjTHA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-diff@30.4.1: resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-docblock@30.0.0: + resolution: {integrity: sha512-By/iQ0nvTzghEecGzUMCp1axLtBh+8wB4Hpoi5o+x1stycjEmPcH1mHugL4D9Q+YKV++vKeX/3ZTW90QC8ICPg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-docblock@30.4.0: resolution: {integrity: sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-each@30.0.0: + resolution: {integrity: sha512-qkFEW3cfytEjG2KtrhwtldZfXYnWSanO8xUMXLe4A6yaiHMHJUalk0Yyv4MQH6aeaxgi4sGVrukvF0lPMM7U1w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-each@30.4.1: resolution: {integrity: sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-environment-jsdom@30.0.0: + resolution: {integrity: sha512-IjDRABkSx+HpO7+WGVKPZL5XZajWRsMo2iQIudyiG4BhCi9Uah9HrFluqLUXdjPkIOoox+utUEUl8TDR2kc/Og==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@30.0.0: + resolution: {integrity: sha512-sF6lxyA25dIURyDk4voYmGU9Uwz2rQKMfjxKnDd19yk+qxKGrimFqS5YsPHWTlAVBo+YhWzXsqZoaMzrTFvqfg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-environment-node@30.4.1: resolution: {integrity: sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-haste-map@30.0.0: + resolution: {integrity: sha512-p4bXAhXTawTsADgQgTpbymdLaTyPW1xWNu1oIGG7/N3LIAbZVkH2JMJqS8/IUcnGR8Kc7WFE+vWbJvsqGCWZXw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-haste-map@30.4.1: resolution: {integrity: sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-leak-detector@30.0.0: + resolution: {integrity: sha512-E/ly1azdVVbZrS0T6FIpyYHvsdek4FNaThJTtggjV/8IpKxh3p9NLndeUZy2+sjAI3ncS+aM0uLLon/dBg8htA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-leak-detector@30.4.1: resolution: {integrity: sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-matcher-utils@30.0.0: + resolution: {integrity: sha512-m5mrunqopkrqwG1mMdJxe1J4uGmS9AHHKYUmoxeQOxBcLjEvirIrIDwuKmUYrecPHVB/PUBpXs2gPoeA2FSSLQ==} + 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@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@30.0.0: + resolution: {integrity: sha512-pV3qcrb4utEsa/U7UI2VayNzSDQcmCllBZLSoIucrESRu0geKThFZOjjh0kACDJFJRAQwsK7GVsmS6SpEceD8w==} + 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@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@30.0.0: + resolution: {integrity: sha512-W2sRA4ALXILrEetEOh2ooZG6fZ01iwVs0OWMKSSWRcUlaLr4ESHuiKXDNTg+ZVgOq8Ei5445i/Yxrv59VT+XkA==} + 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} @@ -6431,6 +6858,18 @@ packages: jest-resolve: optional: true + jest-preset-angular@16.0.0: + resolution: {integrity: sha512-FVo98EZiJ9cwHeteJozCCIkgJecytt1tu0t8DrAMTyyQ4x/seeZmctkWXP0J9uGyARS0Kcwd+f2YeKqKQOB2yA==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} + peerDependencies: + '@angular/compiler-cli': '>=19.0.0 <22.0.0' + '@angular/core': '>=19.0.0 <22.0.0' + '@angular/platform-browser': '>=19.0.0 <22.0.0' + '@angular/platform-browser-dynamic': '>=19.0.0 <22.0.0' + jest: ^30.0.0 + jsdom: '>=26.0.0' + typescript: '>=5.5' + jest-regex-util@30.0.0: resolution: {integrity: sha512-rT84010qRu/5OOU7a9TeidC2Tp3Qgt9Sty4pOZ/VSDuEmRupIjKZAb53gU3jr4ooMlhwScrgC9UixJxWzVu9oQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6439,22 +6878,46 @@ packages: resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-resolve-dependencies@30.0.0: + resolution: {integrity: sha512-Yhh7odCAUNXhluK1bCpwIlHrN1wycYaTlZwq1GdfNBEESNNI/z1j1a7dUEWHbmB9LGgv0sanxw3JPmWU8NeebQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.0.0: + resolution: {integrity: sha512-zwWl1P15CcAfuQCEuxszjiKdsValhnWcj/aXg/R3aMHs8HVoCWHC4B/+5+1BirMoOud8NnN85GSP2LEZCbj3OA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-resolve@30.4.1: resolution: {integrity: sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runner@30.0.0: + resolution: {integrity: sha512-xbhmvWIc8X1IQ8G7xTv0AQJXKjBVyxoVJEJgy7A4RXsSaO+k/1ZSBbHwjnUhvYqMvwQPomWssDkUx6EoidEhlw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runner@30.4.2: resolution: {integrity: sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runtime@30.0.0: + resolution: {integrity: sha512-/O07qVgFrFAOGKGigojmdR3jUGz/y3+a/v9S/Yi2MHxsD+v6WcPppglZJw0gNJkRBArRDK8CFAwpM/VuEiiRjA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-runtime@30.4.2: resolution: {integrity: sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-snapshot@30.0.0: + resolution: {integrity: sha512-6oCnzjpvfj/UIOMTqKZ6gedWAUgaycMdV8Y8h2dRJPvc2wSjckN03pzeoonw8y33uVngfx7WMo1ygdRGEKOT7w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-snapshot@30.4.1: resolution: {integrity: sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@30.0.0: resolution: {integrity: sha512-fhNBBM9uSUbd4Lzsf8l/kcAdaHD/4SgoI48en3HXcBEMwKwoleKFMZ6cYEYs21SB779PRuRCyNLmymApAm8tZw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6463,10 +6926,18 @@ packages: resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-validate@30.0.0: + resolution: {integrity: sha512-d6OkzsdlWItHAikUDs1hlLmpOIRhsZoXTCliV2XXalVQ3ZOeb9dy0CQ6AKulJu/XOZqpOEr/FiMH+FeOBVV+nw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-validate@30.4.1: resolution: {integrity: sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-watcher@30.0.0: + resolution: {integrity: sha512-fbAkojcyS53bOL/B7XYhahORq9cIaPwOgd/p9qW/hybbC8l6CzxfWJJxjlPBAIVN8dRipLR0zdhpGQdam+YBtw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-watcher@30.4.1: resolution: {integrity: sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -6475,10 +6946,24 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} + jest-worker@30.0.0: + resolution: {integrity: sha512-VZvxfWIybIvwK8N/Bsfe43LfQgd/rD0c4h5nLUx78CAqPxIQcW2qDjsVAC53iUR8yxzFIeCFFvWOh8en8hGzdg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-worker@30.4.1: resolution: {integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest@30.0.0: + resolution: {integrity: sha512-/3G2iFwsUY95vkflmlDn/IdLyLWqpQXcftptooaPH4qkyU52V7qVYf1BjmdSPlp1+0fs6BmNtrGaSFwOfV07ew==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -6497,20 +6982,20 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.15.0: - resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.3.0: - resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdom@29.1.1: - resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -6528,6 +7013,10 @@ 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-parse-even-better-errors@5.0.0: resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -6590,8 +7079,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - launch-editor@2.14.1: - resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + launch-editor@2.13.2: + resolution: {integrity: sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==} less-loader@12.3.0: resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} @@ -6661,6 +7150,10 @@ packages: resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lint-staged@17.0.5: resolution: {integrity: sha512-d12yC+/e8RhBjZtaxZn71FyrgU/P5e+uAPifhCLwdosQZP/zamSdKRWDC30ocVIbzDKiFG1McHc/LUgB92GIPw==} engines: {node: '>=22.22.1'} @@ -6750,6 +7243,9 @@ packages: lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -6968,11 +7464,6 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - moment-timezone@0.5.48: resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==} @@ -7109,6 +7600,10 @@ packages: engines: {node: ^20.17.0 || >=22.9.0} hasBin: true + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -7148,6 +7643,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + nx@22.7.3: resolution: {integrity: sha512-yo2XWmxFF01D2i5YBk34Dz1K7YX2u7BoBuCSbD819lIus9B8LNJ7BzbnWfDFXOcvuGoLXqIxO2ElPqpkx5e5JQ==} hasBin: true @@ -7171,10 +7669,6 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - obug@2.1.3: - resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} - engines: {node: '>=12.20.0'} - on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -7233,13 +7727,13 @@ packages: ordered-binary@1.6.1: resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + ospath@1.2.2: resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} - oxc-parser@0.121.0: - resolution: {integrity: sha512-ek9o58+SCv6AV7nchiAcUJy1DNE2CC5WRdBcO0mF+W4oRjNQfPO7b3pLjTHSFECpHkKGOZSQxx3hk8viIL5YCg==} - engines: {node: ^20.19.0 || >=22.12.0} - oxc-resolver@11.19.1: resolution: {integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==} @@ -7302,6 +7796,10 @@ 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-node-version@1.0.1: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} @@ -7319,6 +7817,9 @@ packages: parse5@4.0.0: resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parse5@8.0.1: resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} @@ -7329,9 +7830,6 @@ packages: pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -7369,9 +7867,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -7401,14 +7896,18 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - piscina@5.2.0: - resolution: {integrity: sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==} + piscina@5.1.4: + resolution: {integrity: sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==} engines: {node: '>=20.x'} pkce-challenge@5.0.1: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + pkg-dir@7.0.0: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} @@ -7703,6 +8202,14 @@ packages: pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-format@30.0.0: + resolution: {integrity: sha512-18NAOUr4ZOQiIR+BgI5NhQE7uREdx4ZyV0dyay5izh4yfQ+1T7BSvggxvRGoXocrRyevqW5OhScUjbi9GB8R8Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.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} @@ -7756,6 +8263,10 @@ packages: resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} engines: {node: '>=16.0.0'} + qs@6.14.2: + resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} + engines: {node: '>=0.6'} + qs@6.15.2: resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} @@ -7778,8 +8289,8 @@ packages: 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==} + react-is@19.2.6: + resolution: {integrity: sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==} react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} @@ -7788,6 +8299,14 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-pkg-up@10.1.0: + resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} + engines: {node: '>=16'} + + read-pkg@8.1.0: + resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} + engines: {node: '>=16'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -7852,6 +8371,10 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} @@ -7925,6 +8448,9 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} @@ -8178,11 +8704,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} - engines: {node: '>=10'} - hasBin: true - send@0.19.2: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} @@ -8242,9 +8763,6 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -8325,9 +8843,15 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} @@ -8361,9 +8885,6 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -8375,9 +8896,6 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - stdin-discarder@0.3.2: resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} @@ -8489,8 +9007,8 @@ packages: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} - systeminformation@5.31.12: - resolution: {integrity: sha512-qnTtO5wHrKeKE/MvQ6iIt6XAV+5fgt/kPIQf27DYgjVQQuHUfWkV4Gu6k04ZpEzAMuyQ3ZsovY7Ivhp+E9JyWw==} + systeminformation@5.27.7: + resolution: {integrity: sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==} engines: {node: '>=8.0.0'} os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true @@ -8507,8 +9025,8 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar@7.5.19: - resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==} + tar@7.5.15: + resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} engines: {node: '>=18'} terser-webpack-plugin@5.6.0: @@ -8587,9 +9105,6 @@ packages: thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.2.2: resolution: {integrity: sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g==} engines: {node: '>=18'} @@ -8602,26 +9117,23 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} - engines: {node: '>=14.0.0'} - tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - tldts-core@7.4.6: - resolution: {integrity: sha512-TkQNGJIhlEphpHCjKodMTSe23egUZr/g+flI2qkLgiJ/maAzSgXypSLRTNH3nCmqgayEmtcJBiLcfODSAr1xoA==} - tldts@6.1.86: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tldts@7.4.6: - resolution: {integrity: sha512-rbP0Gyx8b3Ae9yO//CU2wbSnQNoQ66m1nJdSbSHmnwKwzkkz/u8mERYU8T2rmlmy+bJvRNn84yNCW8gYqox44Q==} - hasBin: true + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.2.4: + resolution: {integrity: sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==} + engines: {node: '>=14.14'} - tmp@0.2.7: - resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} tmpl@1.0.5: @@ -8643,16 +9155,12 @@ packages: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} - tough-cookie@6.0.1: - resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} - engines: {node: '>=16'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} tree-dump@1.1.0: resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} @@ -8679,6 +9187,33 @@ packages: '@rspack/core': optional: true + ts-jest@29.4.9: + resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <7' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + ts-loader@9.5.7: resolution: {integrity: sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==} engines: {node: '>=12.0.0'} @@ -8686,9 +9221,6 @@ packages: typescript: '*' webpack: ^5.0.0 - ts-morph@21.0.1: - resolution: {integrity: sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==} - ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -8703,17 +9235,6 @@ packages: '@swc/wasm': optional: true - tsconfck@3.1.6: - resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} - engines: {node: ^18 || >=20} - deprecated: unmaintained - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - tsconfig-paths-webpack-plugin@4.2.0: resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} engines: {node: '>=10.13.0'} @@ -8767,6 +9288,14 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -8778,8 +9307,8 @@ packages: typed-assert@1.0.9: resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - typescript-eslint@8.61.0: - resolution: {integrity: sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==} + typescript-eslint@8.60.0: + resolution: {integrity: sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -8798,12 +9327,20 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@6.27.0: - resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + + undici@6.25.0: + resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} engines: {node: '>=18.17'} - undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + undici@7.24.4: + resolution: {integrity: sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==} + engines: {node: '>=20.18.1'} + + undici@7.24.7: + resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==} engines: {node: '>=20.18.1'} unicode-canonical-property-names-ecmascript@2.0.1: @@ -8874,8 +9411,9 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@11.1.1: - resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-compile-cache-lib@3.0.1: @@ -8885,6 +9423,9 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-name@7.0.2: resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} engines: {node: ^20.17.0 || >=22.9.0} @@ -8900,13 +9441,8 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - vite-tsconfig-paths@6.1.1: - resolution: {integrity: sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==} - peerDependencies: - vite: ^7.3.5 - - vite@7.3.6: - resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} + vite@7.3.2: + resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -8945,47 +9481,6 @@ packages: yaml: optional: true - vitest@4.1.9: - resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.9 - '@vitest/browser-preview': 4.1.9 - '@vitest/browser-webdriverio': 4.1.9 - '@vitest/coverage-istanbul': 4.1.9 - '@vitest/coverage-v8': 4.1.9 - '@vitest/ui': 4.1.9 - happy-dom: '*' - jsdom: '*' - vite: ^7.3.5 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -9009,9 +9504,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@8.0.1: - resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} - engines: {node: '>=20'} + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} webpack-dev-middleware@7.4.5: resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} @@ -9022,8 +9517,21 @@ packages: webpack: optional: true - webpack-dev-server@5.2.6: - resolution: {integrity: sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw==} + webpack-dev-server@5.2.3: + resolution: {integrity: sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-dev-server@5.2.4: + resolution: {integrity: sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==} engines: {node: '>= 18.12.0'} hasBin: true peerDependencies: @@ -9094,13 +9602,18 @@ packages: engines: {node: '>=12'} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - whatwg-mimetype@5.0.0: - resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} - engines: {node: '>=20'} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - whatwg-url@16.0.1: - resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -9119,11 +9632,6 @@ packages: engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} @@ -9298,12 +9806,12 @@ snapshots: '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.2) '@octokit/request': 8.4.1 '@octokit/request-error': 5.1.1 - undici: 6.27.0 + undici: 5.29.0 '@actions/http-client@2.2.3': dependencies: tunnel: 0.0.6 - undici: 6.27.0 + undici: 5.29.0 '@actions/io@1.1.3': {} @@ -9399,30 +9907,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.9(295d2e4e0ca82eebfa5597348c175ee6))(@angular/build@21.2.9(0deaaa798e212dc863fa34ccc5708123))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))': - dependencies: - magic-string: 0.30.21 - obug: 2.1.3 - oxc-parser: 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - tinyglobby: 0.2.16 - ts-morph: 21.0.1 - optionalDependencies: - '@angular-devkit/build-angular': 21.2.9(295d2e4e0ca82eebfa5597348c175ee6) - '@angular/build': 21.2.9(0deaaa798e212dc863fa34ccc5708123) - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - '@analogjs/vitest-angular@2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular-devkit/build-angular@21.2.9(295d2e4e0ca82eebfa5597348c175ee6))(@angular/build@21.2.9(0deaaa798e212dc863fa34ccc5708123))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.12(chokidar@5.0.0))(@angular-devkit/schematics@21.2.9(chokidar@5.0.0))(vitest@4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)))(zone.js@0.16.2)': - dependencies: - '@analogjs/vite-plugin-angular': 2.6.2(@angular-devkit/build-angular@21.2.9(295d2e4e0ca82eebfa5597348c175ee6))(@angular/build@21.2.9(0deaaa798e212dc863fa34ccc5708123))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) - '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) - '@angular-devkit/schematics': 21.2.9(chokidar@5.0.0) - vitest: 4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) - optionalDependencies: - zone.js: 0.16.2 - '@angular-devkit/architect@0.2102.12(chokidar@5.0.0)': dependencies: '@angular-devkit/core': 21.2.12(chokidar@5.0.0) @@ -9437,69 +9921,71 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.2.9(295d2e4e0ca82eebfa5597348c175ee6)': + '@angular-devkit/build-angular@21.2.9(a9fd8aa867e20e7d10d62fc3ab6618cf)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.9(chokidar@5.0.0) - '@angular-devkit/build-webpack': 0.2102.9(chokidar@5.0.0)(webpack-dev-server@5.2.6(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + '@angular-devkit/build-webpack': 0.2102.9(chokidar@5.0.0)(webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) '@angular-devkit/core': 21.2.9(chokidar@5.0.0) - '@angular/build': 21.2.9(4c4533c68d80138194a7b3928111e0fd) - '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3) - '@babel/core': 7.29.7 + '@angular/build': 21.2.9(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(@angular/compiler@21.2.9)(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.19)(chokidar@5.0.0)(jiti@2.7.0)(less@4.4.2)(ng-packagr@21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3))(postcss@8.5.12)(sass-embedded@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tslib@2.8.1)(tsx@4.22.3)(typescript@5.9.3)(yaml@2.9.0) + '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3) + '@babel/core': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.7) - '@babel/preset-env': 7.29.2(@babel/core@7.29.7) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0) + '@babel/preset-env': 7.29.2(@babel/core@7.29.0) '@babel/runtime': 7.29.2 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.2.9(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + '@ngtools/webpack': 21.2.9(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) ansi-colors: 4.1.3 autoprefixer: 10.4.27(postcss@8.5.12) - babel-loader: 10.0.0(@babel/core@7.29.7)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + babel-loader: 10.0.0(@babel/core@7.29.0)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) browserslist: 4.28.2 - copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) - css-loader: 7.1.3(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + copy-webpack-plugin: 14.0.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) + css-loader: 7.1.3(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) esbuild-wasm: 0.27.3 - http-proxy-middleware: 3.0.7 + http-proxy-middleware: 3.0.5 istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 karma-source-map-support: 1.4.0 less: 4.4.2 - less-loader: 12.3.1(@rspack/core@1.7.11(@swc/helpers@0.5.18))(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) - license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + less-loader: 12.3.1(@rspack/core@1.7.11(@swc/helpers@0.5.18))(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) + license-webpack-plugin: 4.0.2(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) loader-utils: 3.3.1 - mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + mini-css-extract-plugin: 2.10.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) open: 11.0.0 ora: 9.3.0 picomatch: 4.0.4 - piscina: 5.2.0 + piscina: 5.1.4 postcss: 8.5.12 - postcss-loader: 8.2.0(@rspack/core@1.7.11(@swc/helpers@0.5.18))(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + postcss-loader: 8.2.0(@rspack/core@1.7.11(@swc/helpers@0.5.18))(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) resolve-url-loader: 5.0.0 rxjs: 7.8.2 sass: 1.97.3 - sass-loader: 16.0.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(sass-embedded@1.100.0)(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + sass-loader: 16.0.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(sass-embedded@1.100.0)(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) semver: 7.7.4 - source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + source-map-loader: 5.0.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) source-map-support: 0.5.21 terser: 5.46.0 tinyglobby: 0.2.15 tree-kill: 1.2.2 tslib: 2.8.1 typescript: 5.9.3 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) - webpack-dev-server: 5.2.6(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) + webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) optionalDependencies: - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) - esbuild: 0.28.1 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) + esbuild: 0.27.3 + jest: 30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + jest-environment-jsdom: 30.0.0 + ng-packagr: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) transitivePeerDependencies: - '@angular/compiler' - '@emnapi/core' @@ -9532,12 +10018,12 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-webpack@0.2102.9(chokidar@5.0.0)(webpack-dev-server@5.2.6(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12))': + '@angular-devkit/build-webpack@0.2102.9(chokidar@5.0.0)(webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12))': dependencies: '@angular-devkit/architect': 0.2102.9(chokidar@5.0.0) rxjs: 7.8.2 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) - webpack-dev-server: 5.2.6(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) + webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) transitivePeerDependencies: - chokidar @@ -9583,57 +10069,68 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@21.4.0(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@angular-eslint/builder@21.4.0(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@angular-devkit/architect': 0.2102.12(chokidar@5.0.0) '@angular-devkit/core': 21.2.9(chokidar@5.0.0) '@angular/cli': 21.2.12(@types/node@22.19.19)(chokidar@5.0.0) - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - chokidar + '@angular-eslint/bundled-angular-compiler@21.2.0': {} + '@angular-eslint/bundled-angular-compiler@21.4.0': {} - '@angular-eslint/eslint-plugin-template@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin-template@21.2.0(@angular-eslint/template-parser@21.2.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.60.0)(@typescript-eslint/utils@8.40.0(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: - '@angular-eslint/bundled-angular-compiler': 21.4.0 - '@angular-eslint/template-parser': 21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/bundled-angular-compiler': 21.2.0 + '@angular-eslint/template-parser': 21.2.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/utils': 21.2.0(@typescript-eslint/utils@8.40.0(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/types': 8.60.0 + '@typescript-eslint/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) aria-query: 5.3.2 axobject-query: 4.1.0 - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 - '@angular-eslint/eslint-plugin-template@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.61.0)(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin-template@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.40.0(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: '@angular-eslint/bundled-angular-compiler': 21.4.0 - '@angular-eslint/template-parser': 21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/template-parser': 21.4.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.40.0(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/types': 8.59.4 + '@typescript-eslint/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) aria-query: 5.3.2 axobject-query: 4.1.0 - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) + typescript: 5.9.3 + + '@angular-eslint/eslint-plugin@21.2.0(@typescript-eslint/utils@8.40.0(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: + '@angular-eslint/bundled-angular-compiler': 21.2.0 + '@angular-eslint/utils': 21.2.0(@typescript-eslint/utils@8.40.0(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/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/eslint-plugin@21.4.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@angular-eslint/eslint-plugin@21.4.0(@typescript-eslint/utils@8.40.0(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: '@angular-eslint/bundled-angular-compiler': 21.4.0 - '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - eslint: 10.4.1(jiti@2.7.0) + '@angular-eslint/utils': 21.4.0(@typescript-eslint/utils@8.40.0(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/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@angular-eslint/schematics@21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@angular-devkit/core': 21.2.9(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.9(chokidar@5.0.0) - '@angular-eslint/eslint-plugin': 21.4.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/eslint-plugin': 21.4.0(@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@angular/cli': 21.2.12(@types/node@22.19.19)(chokidar@5.0.0) ignore: 7.0.5 semver: 7.7.4 @@ -9646,39 +10143,53 @@ snapshots: - eslint - typescript - '@angular-eslint/template-parser@21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@angular-eslint/template-parser@21.2.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@angular-eslint/bundled-angular-compiler': 21.2.0 + eslint: 9.39.4(jiti@2.7.0) + eslint-scope: 9.1.2 + typescript: 5.9.3 + + '@angular-eslint/template-parser@21.4.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@angular-eslint/bundled-angular-compiler': 21.4.0 - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) eslint-scope: 9.1.2 typescript: 5.9.3 - '@angular-eslint/utils@21.4.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@angular-eslint/utils@21.2.0(@typescript-eslint/utils@8.40.0(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: + '@angular-eslint/bundled-angular-compiler': 21.2.0 + '@typescript-eslint/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) + typescript: 5.9.3 + + '@angular-eslint/utils@21.4.0(@typescript-eslint/utils@8.40.0(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: '@angular-eslint/bundled-angular-compiler': 21.4.0 - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 - '@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))': + '@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))': dependencies: - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) tslib: 2.8.1 - '@angular/build@21.2.9(0deaaa798e212dc863fa34ccc5708123)': + '@angular/build@21.2.9(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(@angular/compiler@21.2.9)(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.19)(chokidar@5.0.0)(jiti@2.7.0)(less@4.4.2)(ng-packagr@21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3))(postcss@8.5.12)(sass-embedded@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tslib@2.8.1)(tsx@4.22.3)(typescript@5.9.3)(yaml@2.9.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.9(chokidar@5.0.0) - '@angular/compiler': 21.2.17 - '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3) - '@babel/core': 7.29.7 + '@angular/compiler': 21.2.9 + '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3) + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@22.19.19) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@22.19.19)(jiti@2.7.0)(less@4.4.2)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.2 - esbuild: 0.28.1 + esbuild: 0.27.3 https-proxy-agent: 7.0.6 istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 @@ -9687,7 +10198,7 @@ snapshots: mrmime: 2.0.1 parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.4 - piscina: 5.2.0 + piscina: 5.1.4 rolldown: 1.0.0-rc.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) sass: 1.97.3 semver: 7.7.4 @@ -9695,17 +10206,16 @@ snapshots: tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 - undici: 7.28.0 - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) + undici: 7.24.4 + vite: 7.3.2(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) - less: 4.6.4 + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) + less: 4.4.2 lmdb: 3.5.1 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.15 - vitest: 4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) + ng-packagr: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + postcss: 8.5.12 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -9720,22 +10230,21 @@ snapshots: - terser - tsx - yaml - optional: true - '@angular/build@21.2.9(4c4533c68d80138194a7b3928111e0fd)': + '@angular/build@21.2.9(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(@angular/compiler@21.2.9)(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.19)(chokidar@5.0.0)(jiti@2.7.0)(less@4.6.4)(ng-packagr@21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3))(postcss@8.5.15)(sass-embedded@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tslib@2.8.1)(tsx@4.22.3)(typescript@5.9.3)(yaml@2.9.0)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.9(chokidar@5.0.0) - '@angular/compiler': 21.2.17 - '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3) - '@babel/core': 7.29.7 + '@angular/compiler': 21.2.9 + '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3) + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@22.19.19) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@22.19.19)(jiti@2.7.0)(less@4.4.2)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.2 - esbuild: 0.28.1 + esbuild: 0.27.3 https-proxy-agent: 7.0.6 istanbul-lib-instrument: 6.0.3 jsonc-parser: 3.3.1 @@ -9744,7 +10253,7 @@ snapshots: mrmime: 2.0.1 parse5-html-rewriting-stream: 8.0.0 picomatch: 4.0.4 - piscina: 5.2.0 + piscina: 5.1.4 rolldown: 1.0.0-rc.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) sass: 1.97.3 semver: 7.7.4 @@ -9752,17 +10261,16 @@ snapshots: tinyglobby: 0.2.15 tslib: 2.8.1 typescript: 5.9.3 - undici: 7.28.0 - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.4.2)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) + undici: 7.24.4 + vite: 7.3.2(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) - less: 4.4.2 + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) + less: 4.6.4 lmdb: 3.5.1 - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) - postcss: 8.5.12 - vitest: 4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) + ng-packagr: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + postcss: 8.5.15 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -9777,12 +10285,13 @@ snapshots: - terser - tsx - yaml + optional: true - '@angular/cdk@21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': + '@angular/cdk@21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + '@angular/common': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) parse5: 8.0.1 rxjs: 7.8.2 tslib: 2.8.1 @@ -9813,16 +10322,16 @@ snapshots: - chokidar - supports-color - '@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2)': + '@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3)': + '@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3)': dependencies: - '@angular/compiler': 21.2.17 - '@babel/core': 7.29.7 + '@angular/compiler': 21.2.9 + '@babel/core': 7.29.0 '@jridgewell/sourcemap-codec': 1.5.5 chokidar: 5.0.0 convert-source-map: 1.9.0 @@ -9835,89 +10344,77 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@21.2.17': + '@angular/compiler@21.2.9': dependencies: tslib: 2.8.1 - '@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)': + '@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 21.2.17 + '@angular/compiler': 21.2.9 zone.js: 0.16.2 - '@angular/forms@21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': + '@angular/forms@21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + '@angular/common': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 '@angular/language-service@21.2.9': {} - '@angular/material-moment-adapter@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/material@21.2.9(b714a1b1cbe0063e64a2c2926bd28b9a))(moment@2.30.1)': + '@angular/material-moment-adapter@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/material@21.2.9(1a0f58261cc7dd308ee8aff5dec3823f))(moment@2.30.1)': dependencies: - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/material': 21.2.9(b714a1b1cbe0063e64a2c2926bd28b9a) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/material': 21.2.9(1a0f58261cc7dd308ee8aff5dec3823f) moment: 2.30.1 tslib: 2.8.1 - '@angular/material@21.2.9(b714a1b1cbe0063e64a2c2926bd28b9a)': + '@angular/material@21.2.9(1a0f58261cc7dd308ee8aff5dec3823f)': dependencies: - '@angular/cdk': 21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) - '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/forms': 21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) - '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + '@angular/cdk': 21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + '@angular/common': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/forms': 21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/platform-browser-dynamic@21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@21.2.17)(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))': + '@angular/platform-browser-dynamic@21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@21.2.9)(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))': dependencies: - '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) - '@angular/compiler': 21.2.17 - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + '@angular/common': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/compiler': 21.2.9 + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) tslib: 2.8.1 - '@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))': + '@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))': dependencies: - '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/common': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + '@angular/animations': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) - '@angular/router@21.2.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': + '@angular/router@21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(rxjs@7.8.2)': dependencies: - '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) - '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)) + '@angular/common': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) rxjs: 7.8.2 tslib: 2.8.1 - '@asamuzakjp/css-color@5.1.11': - dependencies: - '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - - '@asamuzakjp/dom-selector@7.1.1': + '@asamuzakjp/css-color@3.2.0': dependencies: - '@asamuzakjp/generational-cache': 1.0.1 - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.2.1 - is-potential-custom-element-name: 1.0.1 - - '@asamuzakjp/generational-cache@1.0.1': {} - - '@asamuzakjp/nwsapi@2.3.9': {} + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 '@babel/code-frame@7.29.0': dependencies: @@ -9925,27 +10422,19 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/compat-data@7.29.3': {} - '@babel/compat-data@7.29.7': {} - - '@babel/core@7.29.7': + '@babel/core@7.29.0': 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) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) @@ -9963,14 +10452,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.29.7': - dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.29.0 @@ -9983,37 +10464,29 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-compilation-targets@7.29.7': - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.29.7)': + '@babel/helper-create-class-features-plugin@7.29.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.7) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.7)': + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3(supports-color@8.1.1) @@ -10024,8 +10497,6 @@ snapshots: '@babel/helper-globals@7.28.0': {} - '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.28.5': dependencies: '@babel/traverse': 7.29.0 @@ -10040,49 +10511,33 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.29.7': - dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-optimise-call-expression@7.27.1': dependencies: '@babel/types': 7.29.0 '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.7)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.7)': + '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 '@babel/traverse': 7.29.0 @@ -10102,16 +10557,10 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-validator-option@7.29.7': {} - '@babel/helper-wrap-function@7.28.6': dependencies: '@babel/template': 7.28.6 @@ -10120,714 +10569,696 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helpers@7.29.7': + '@babel/helpers@7.29.2': dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 '@babel/parser@7.29.3': dependencies: '@babel/types': 7.29.0 - '@babel/parser@7.29.7': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': dependencies: - '@babel/types': 7.29.7 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3(@babel/core@7.29.7)': + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@7.29.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.7)': + '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - optional: true - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.7)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.7)': + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.7) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.7) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.7) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/template': 7.28.6 - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.7)': + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.7)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.4(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-systemjs@7.29.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.7)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.7) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.7)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.7)': + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.7)': + '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.7)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.7)': + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/preset-env@7.29.2(@babel/core@7.29.7)': + '@babel/preset-env@7.29.2(@babel/core@7.29.0)': dependencies: '@babel/compat-data': 7.29.3 - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.7) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.7) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-modules-systemjs': 7.29.4(@babel/core@7.29.7) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.7) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7) - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) - babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.4(@babel/core@7.29.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) core-js-compat: 3.49.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-env@7.29.5(@babel/core@7.29.7)': + '@babel/preset-env@7.29.5(@babel/core@7.29.0)': dependencies: '@babel/compat-data': 7.29.3 - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.7) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.3(@babel/core@7.29.7) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.7) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.7) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.7) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-modules-systemjs': 7.29.4(@babel/core@7.29.7) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.7) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.7) - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) - babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 7.29.3(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.4(@babel/core@7.29.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) core-js-compat: 3.49.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/types': 7.29.0 esutils: 2.0.3 - '@babel/preset-typescript@7.28.5(@babel/core@7.29.7)': + '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -10843,12 +11274,6 @@ snapshots: '@babel/parser': 7.29.3 '@babel/types': 7.29.0 - '@babel/template@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -10861,34 +11286,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.7': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - - '@bcoe/v8-coverage@0.2.3': - optional: true - - '@bramus/specificity@2.4.2': - dependencies: - css-tree: 3.2.1 + '@bcoe/v8-coverage@0.2.3': {} '@bufbuild/protobuf@2.12.0': {} @@ -11008,29 +11411,25 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/color-helpers@6.1.0': {} + '@csstools/color-helpers@5.1.0': {} - '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/color-helpers': 6.1.0 - '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-tokenizer': 4.0.0 - - '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': - optionalDependencies: - css-tree: 3.2.1 + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-tokenizer@4.0.0': {} + '@csstools/css-tokenizer@3.0.4': {} '@cypress/request@3.0.10': dependencies: @@ -11040,18 +11439,18 @@ snapshots: combined-stream: 1.0.8 extend: 3.0.2 forever-agent: 0.6.1 - form-data: 4.0.6 + form-data: 4.0.5 http-signature: 1.4.0 is-typedarray: 1.0.0 isstream: 0.1.2 json-stringify-safe: 5.0.1 mime-types: 2.1.35 performance-now: 2.1.0 - qs: 6.15.2 + qs: 6.14.2 safe-buffer: 5.2.1 tough-cookie: 5.1.2 tunnel-agent: 0.6.0 - uuid: 11.1.1 + uuid: 8.3.2 optional: true '@cypress/xvfb@1.2.4(supports-color@8.1.1)': @@ -11090,128 +11489,296 @@ snapshots: dependencies: tslib: 2.8.1 - '@esbuild/aix-ppc64@0.28.1': + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.27.3': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-arm@0.28.0': optional: true - '@esbuild/android-arm64@0.28.1': + '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/android-arm@0.28.1': + '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/android-x64@0.28.1': + '@esbuild/linux-ia32@0.28.0': optional: true - '@esbuild/darwin-arm64@0.28.1': + '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/darwin-x64@0.28.1': + '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.28.1': + '@esbuild/linux-loong64@0.28.0': optional: true - '@esbuild/freebsd-x64@0.28.1': + '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-arm64@0.28.1': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-arm@0.28.1': + '@esbuild/linux-mips64el@0.28.0': optional: true - '@esbuild/linux-ia32@0.28.1': + '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-loong64@0.28.1': + '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-mips64el@0.28.1': + '@esbuild/linux-ppc64@0.28.0': optional: true - '@esbuild/linux-ppc64@0.28.1': + '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.28.1': + '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-s390x@0.28.1': + '@esbuild/linux-riscv64@0.28.0': optional: true - '@esbuild/linux-x64@0.28.1': + '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.28.1': + '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/netbsd-x64@0.28.1': + '@esbuild/linux-s390x@0.28.0': optional: true - '@esbuild/openbsd-arm64@0.28.1': + '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.28.1': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/openharmony-arm64@0.28.1': + '@esbuild/linux-x64@0.28.0': optional: true - '@esbuild/sunos-x64@0.28.1': + '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/win32-arm64@0.28.1': + '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.28.1': + '@esbuild/netbsd-arm64@0.28.0': optional: true - '@esbuild/win32-x64@0.28.1': + '@esbuild/netbsd-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1(jiti@2.7.0))': + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.27.3': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.27.3': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.27.3': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.27.3': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.27.3': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': dependencies: - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.21.2': dependencies: - '@eslint/object-schema': 3.0.5 + '@eslint/object-schema': 2.1.7 debug: 4.4.3(supports-color@8.1.1) - minimatch: 10.2.5 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 1.2.1 + '@eslint/core': 0.17.0 - '@eslint/core@1.2.1': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.4.1(jiti@2.7.0))': - optionalDependencies: - eslint: 10.4.1(jiti@2.7.0) + '@eslint/eslintrc@3.3.5': + dependencies: + ajv: 6.15.0 + debug: 4.4.3(supports-color@8.1.1) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - '@eslint/object-schema@3.0.5': {} + '@eslint/js@9.39.4': {} - '@eslint/plugin-kit@0.7.2': + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 1.2.1 + '@eslint/core': 0.17.0 levn: 0.4.1 - '@exodus/bytes@1.15.1': {} + '@fastify/busboy@2.1.1': {} '@gar/promise-retry@1.0.3': {} '@harperfast/extended-iterable@1.0.3': optional: true - '@hono/node-server@1.19.14(hono@4.12.27)': + '@hono/node-server@1.19.14(hono@4.12.22)': dependencies: - hono: 4.12.27 + hono: 4.12.22 '@humanfs/core@0.19.2': dependencies: @@ -11229,6 +11796,8 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@hutson/parse-repository-url@5.0.0': {} + '@inquirer/ansi@1.0.2': {} '@inquirer/checkbox@4.3.2(@types/node@22.19.19)': @@ -11362,7 +11931,6 @@ snapshots: strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - optional: true '@isaacs/fs-minipass@4.0.1': dependencies: @@ -11373,39 +11941,128 @@ snapshots: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.15.0 + js-yaml: 3.14.2 resolve-from: 5.0.0 - optional: true '@istanbuljs/schema@0.1.6': {} + '@jest/console@30.0.0': + dependencies: + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + chalk: 4.1.2 + jest-message-util: 30.0.0 + jest-util: 30.0.0 + slash: 3.0.0 + '@jest/console@30.4.1': dependencies: '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 chalk: 4.1.2 jest-message-util: 30.4.1 jest-util: 30.4.1 slash: 3.0.0 - optional: true + + '@jest/core@30.0.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3))': + dependencies: + '@jest/console': 30.0.0 + '@jest/pattern': 30.0.0 + '@jest/reporters': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.4.0 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.0.0 + jest-config: 30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + jest-haste-map: 30.0.0 + jest-message-util: 30.0.0 + jest-regex-util: 30.0.0 + jest-resolve: 30.0.0 + jest-resolve-dependencies: 30.0.0 + jest-runner: 30.0.0 + jest-runtime: 30.0.0 + jest-snapshot: 30.0.0 + jest-util: 30.0.0 + jest-validate: 30.0.0 + jest-watcher: 30.0.0 + micromatch: 4.0.8 + pretty-format: 30.0.0 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/diff-sequences@30.0.0': {} '@jest/diff-sequences@30.0.1': {} - '@jest/diff-sequences@30.4.0': - optional: true + '@jest/diff-sequences@30.4.0': {} + + '@jest/environment-jsdom-abstract@30.0.0(jsdom@26.1.0)': + dependencies: + '@jest/environment': 30.0.0 + '@jest/fake-timers': 30.0.0 + '@jest/types': 30.0.0 + '@types/jsdom': 21.1.7 + '@types/node': 22.19.19 + jest-mock: 30.0.0 + jest-util: 30.0.0 + jsdom: 26.1.0 + + '@jest/environment-jsdom-abstract@30.4.1(jsdom@26.1.0)': + dependencies: + '@jest/environment': 30.4.1 + '@jest/fake-timers': 30.4.1 + '@jest/types': 30.4.1 + '@types/jsdom': 21.1.7 + '@types/node': 22.19.19 + jest-mock: 30.4.1 + jest-util: 30.4.1 + jsdom: 26.1.0 + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.19 + jest-mock: 29.7.0 + + '@jest/environment@30.0.0': + dependencies: + '@jest/fake-timers': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + jest-mock: 30.0.0 '@jest/environment@30.4.1': dependencies: '@jest/fake-timers': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 jest-mock: 30.4.1 - optional: true + + '@jest/expect-utils@30.0.0': + dependencies: + '@jest/get-type': 30.0.0 '@jest/expect-utils@30.4.1': dependencies: '@jest/get-type': 30.1.0 - optional: true + + '@jest/expect@30.0.0': + dependencies: + expect: 30.0.0 + jest-snapshot: 30.0.0 + transitivePeerDependencies: + - supports-color '@jest/expect@30.4.1': dependencies: @@ -11413,20 +12070,46 @@ snapshots: jest-snapshot: 30.4.1 transitivePeerDependencies: - supports-color - optional: true + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 22.19.19 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/fake-timers@30.0.0': + dependencies: + '@jest/types': 30.0.0 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 22.19.19 + jest-message-util: 30.0.0 + jest-mock: 30.0.0 + jest-util: 30.0.0 '@jest/fake-timers@30.4.1': dependencies: '@jest/types': 30.4.1 '@sinonjs/fake-timers': 15.4.0 - '@types/node': 22.20.0 + '@types/node': 22.19.19 jest-message-util: 30.4.1 jest-mock: 30.4.1 jest-util: 30.4.1 - optional: true - '@jest/get-type@30.1.0': - optional: true + '@jest/get-type@30.0.0': {} + + '@jest/get-type@30.1.0': {} + + '@jest/globals@30.0.0': + dependencies: + '@jest/environment': 30.0.0 + '@jest/expect': 30.0.0 + '@jest/types': 30.0.0 + jest-mock: 30.0.0 + transitivePeerDependencies: + - supports-color '@jest/globals@30.4.1': dependencies: @@ -11436,7 +12119,6 @@ snapshots: jest-mock: 30.4.1 transitivePeerDependencies: - supports-color - optional: true '@jest/pattern@30.0.0': dependencies: @@ -11448,6 +12130,34 @@ snapshots: '@types/node': 22.19.19 jest-regex-util: 30.4.0 + '@jest/reporters@30.0.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 22.19.19 + chalk: 4.1.2 + collect-v8-coverage: 1.0.3 + exit-x: 0.2.2 + glob: 10.5.0 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.0.0 + jest-util: 30.0.0 + jest-worker: 30.0.0 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + '@jest/reporters@30.4.1': dependencies: '@bcoe/v8-coverage': 0.2.3 @@ -11456,7 +12166,7 @@ snapshots: '@jest/transform': 30.4.1 '@jest/types': 30.4.1 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.20.0 + '@types/node': 22.19.19 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -11475,7 +12185,10 @@ snapshots: v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color - optional: true + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.10 '@jest/schemas@30.0.0': dependencies: @@ -11485,20 +12198,38 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.49 + '@jest/snapshot-utils@30.0.0': + dependencies: + '@jest/types': 30.0.0 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + '@jest/snapshot-utils@30.4.1': dependencies: '@jest/types': 30.4.1 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 - optional: true + + '@jest/source-map@30.0.0': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + graceful-fs: 4.2.11 '@jest/source-map@30.0.1': dependencies: '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 - optional: true + + '@jest/test-result@30.0.0': + dependencies: + '@jest/console': 30.0.0 + '@jest/types': 30.0.0 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.3 '@jest/test-result@30.4.1': dependencies: @@ -11506,7 +12237,13 @@ snapshots: '@jest/types': 30.4.1 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.3 - optional: true + + '@jest/test-sequencer@30.0.0': + dependencies: + '@jest/test-result': 30.0.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.0 + slash: 3.0.0 '@jest/test-sequencer@30.4.1': dependencies: @@ -11514,11 +12251,30 @@ snapshots: graceful-fs: 4.2.11 jest-haste-map: 30.4.1 slash: 3.0.0 - optional: true + + '@jest/transform@30.0.0': + dependencies: + '@babel/core': 7.29.0 + '@jest/types': 30.0.0 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.0 + jest-regex-util: 30.0.0 + jest-util: 30.0.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color '@jest/transform@30.4.1': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@jest/types': 30.4.1 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 @@ -11534,7 +12290,15 @@ snapshots: write-file-atomic: 5.0.1 transitivePeerDependencies: - supports-color - optional: true + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.19.19 + '@types/yargs': 17.0.35 + chalk: 4.1.2 '@jest/types@30.0.0': dependencies: @@ -11585,6 +12349,30 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jscutlery/semver@5.8.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(@types/node@22.19.19)': + dependencies: + '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + chalk: 4.1.2 + conventional-changelog: 5.1.0 + conventional-changelog-angular: 7.0.0 + conventional-changelog-atom: 4.0.0 + conventional-changelog-codemirror: 4.0.0 + conventional-changelog-conventionalcommits: 7.0.2 + conventional-changelog-ember: 4.0.0 + conventional-changelog-eslint: 5.0.0 + conventional-changelog-express: 4.0.0 + conventional-changelog-jquery: 5.0.0 + conventional-changelog-jshint: 4.0.0 + conventional-commits-parser: 5.0.0 + conventional-recommended-bump: 9.0.0 + detect-indent: 6.1.0 + git-semver-tags: 7.0.1 + inquirer: 8.2.7(@types/node@22.19.19) + rxjs: 7.8.2 + semver: 7.8.1 + transitivePeerDependencies: + - '@types/node' + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -11745,7 +12533,7 @@ snapshots: '@modelcontextprotocol/sdk@1.26.0(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.14(hono@4.12.27) + '@hono/node-server': 1.19.14(hono@4.12.22) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -11755,7 +12543,7 @@ snapshots: eventsource-parser: 3.0.8 express: 5.2.1 express-rate-limit: 8.5.2(express@5.2.1) - hono: 4.12.27 + hono: 4.12.22 jose: 6.2.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -11797,7 +12585,7 @@ snapshots: isomorphic-ws: 5.0.0(ws@8.18.0) node-schedule: 2.1.1 typescript: 5.9.3 - undici: 7.28.0 + undici: 7.24.7 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -12147,11 +12935,11 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@ngtools/webpack@21.2.9(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12))': + '@ngtools/webpack@21.2.9(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12))': dependencies: - '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3) + '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3) typescript: 5.9.3 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) '@noble/hashes@1.4.0': {} @@ -12179,7 +12967,7 @@ snapshots: '@npmcli/fs@5.0.0': dependencies: - semver: 7.8.5 + semver: 7.8.1 '@npmcli/git@7.0.2': dependencies: @@ -12263,35 +13051,35 @@ snapshots: csv-parse: 5.6.0 tslib: 2.8.1 - '@nx-tools/nx-container@6.9.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(@nx/js@22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(dotenv@16.4.7)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(tslib@2.8.1)': + '@nx-tools/nx-container@6.9.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(@nx/js@22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(dotenv@16.4.7)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(tslib@2.8.1)': dependencies: '@nx-tools/container-metadata': 6.9.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(tslib@2.8.1) '@nx-tools/core': 6.9.1(@nx/devkit@22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))))(tslib@2.8.1) '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) csv-parse: 5.6.0 dotenv: 16.4.7 handlebars: 4.7.9 nx: 22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)) semver: 7.8.1 - tmp: 0.2.7 + tmp: 0.2.5 tslib: 2.8.1 - '@nx/angular@22.7.3(9ea0010a601f02beef0727647a40b461)': + '@nx/angular@22.7.3(0b4e8de3d8c1b3fb3068996a2ee39e36)': dependencies: '@angular-devkit/core': 21.2.9(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.9(chokidar@5.0.0) '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/eslint': 22.7.3(009a8c00054d1b9afc3e70df1013dd04) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/module-federation': 22.7.3(1e7568c88119a8f46b3f44f17e8832c5) - '@nx/rspack': 22.7.3(1d6a7f03de0f755cc4754f6896e4f79b) - '@nx/web': 22.7.3(ec92657a68652fe73393dccf800c48eb) - '@nx/webpack': 22.7.3(@babel/traverse@7.29.7)(@rspack/core@1.7.11(@swc/helpers@0.5.18))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3) + '@nx/eslint': 22.7.3(2d77eedacad4a73d9b45ca88b5c668cd) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/module-federation': 22.7.3(a144bf2648da73d5ce3e21944d7ee54c) + '@nx/rspack': 22.7.3(571d341635a0c022b733deef2e6e4fdd) + '@nx/web': 22.7.3(7514bcef48269a0eaddae493b1040ef3) + '@nx/webpack': 22.7.3(@babel/traverse@7.29.0)(@rspack/core@1.7.11(@swc/helpers@0.5.18))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3) '@nx/workspace': 22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) '@schematics/angular': 21.2.9(chokidar@5.0.0) - '@typescript-eslint/type-utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) enquirer: 2.3.6 magic-string: 0.30.21 picocolors: 1.1.1 @@ -12301,9 +13089,9 @@ snapshots: tslib: 2.8.1 webpack-merge: 5.10.0 optionalDependencies: - '@angular-devkit/build-angular': 21.2.9(295d2e4e0ca82eebfa5597348c175ee6) - '@angular/build': 21.2.9(0deaaa798e212dc863fa34ccc5708123) - ng-packagr: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) + '@angular-devkit/build-angular': 21.2.9(a9fd8aa867e20e7d10d62fc3ab6618cf) + '@angular/build': 21.2.9(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(@angular/compiler@21.2.9)(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.19)(chokidar@5.0.0)(jiti@2.7.0)(less@4.6.4)(ng-packagr@21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3))(postcss@8.5.15)(sass-embedded@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tslib@2.8.1)(tsx@4.22.3)(typescript@5.9.3)(yaml@2.9.0) + ng-packagr: 21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3) transitivePeerDependencies: - '@babel/traverse' - '@minify-html/node' @@ -12346,14 +13134,14 @@ snapshots: - webpack-cli - webpack-hot-middleware - '@nx/cypress@22.7.3(8ceb40523cd4cfb53719524a7951f5ef)': + '@nx/cypress@22.7.3(37f54892ee2fd5a2a97b4a7a57c0a11e)': dependencies: '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/eslint': 22.7.3(009a8c00054d1b9afc3e70df1013dd04) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/eslint': 22.7.3(2d77eedacad4a73d9b45ca88b5c668cd) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) detect-port: 2.1.0 - semver: 7.8.5 + semver: 7.8.1 tree-kill: 1.2.2 tslib: 2.8.1 optionalDependencies: @@ -12383,14 +13171,14 @@ snapshots: tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/eslint-plugin@22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)))(eslint@10.4.1(jiti@2.7.0))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)': + '@nx/eslint-plugin@22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@typescript-eslint/parser@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-config-prettier@10.0.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)': dependencies: '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) - '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/type-utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) chalk: 4.1.2 confusing-browser-globals: 1.0.11 globals: 17.6.0 @@ -12398,7 +13186,7 @@ snapshots: semver: 7.8.1 tslib: 2.8.1 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.4.1(jiti@2.7.0)) + eslint-config-prettier: 10.0.0(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -12410,16 +13198,16 @@ snapshots: - typescript - verdaccio - '@nx/eslint@22.7.3(009a8c00054d1b9afc3e70df1013dd04)': + '@nx/eslint@22.7.3(2d77eedacad4a73d9b45ca88b5c668cd)': dependencies: '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - eslint: 10.4.1(jiti@2.7.0) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + eslint: 9.39.4(jiti@2.7.0) semver: 7.8.1 tslib: 2.8.1 typescript: 5.9.3 optionalDependencies: - '@nx/jest': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3))(typescript@5.9.3) + '@nx/jest': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3))(typescript@5.9.3) '@zkochan/js-yaml': 0.0.7 transitivePeerDependencies: - '@babel/traverse' @@ -12439,12 +13227,12 @@ snapshots: transitivePeerDependencies: - nx - '@nx/jest@22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3))(typescript@5.9.3)': + '@nx/jest@22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@jest/reporters': 30.4.1 '@jest/test-result': 30.4.1 '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) identity-obj-proxy: 3.0.0 jest-config: 30.4.2(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) @@ -12453,7 +13241,7 @@ snapshots: minimatch: 10.2.5 picocolors: 1.1.1 resolve.exports: 2.0.3 - semver: 7.8.5 + semver: 7.8.1 tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -12470,23 +13258,22 @@ snapshots: - ts-node - typescript - verdaccio - optional: true - '@nx/js@22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))': + '@nx/js@22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))': dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.7) - '@babel/preset-env': 7.29.5(@babel/core@7.29.7) - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0) + '@babel/preset-env': 7.29.5(@babel/core@7.29.0) + '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) '@babel/runtime': 7.29.2 '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) '@nx/workspace': 22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)) '@zkochan/js-yaml': 0.0.7 - babel-plugin-const-enum: 1.2.0(@babel/core@7.29.7) + babel-plugin-const-enum: 1.2.0(@babel/core@7.29.0) babel-plugin-macros: 3.1.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.29.7)(@babel/traverse@7.29.7) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.29.0)(@babel/traverse@7.29.0) chalk: 4.1.2 columnify: 1.6.0 detect-port: 2.1.0 @@ -12508,17 +13295,17 @@ snapshots: - nx - supports-color - '@nx/module-federation@22.7.3(1e7568c88119a8f46b3f44f17e8832c5)': + '@nx/module-federation@22.7.3(a144bf2648da73d5ce3e21944d7ee54c)': dependencies: '@module-federation/enhanced': 2.5.0(@rspack/core@1.6.8(@swc/helpers@0.5.18))(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) '@module-federation/node': 2.7.43(@rspack/core@1.6.8(@swc/helpers@0.5.18))(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) '@module-federation/sdk': 2.5.0(node-fetch@2.7.0(encoding@0.1.13)) '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/web': 22.7.3(ec92657a68652fe73393dccf800c48eb) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/web': 22.7.3(7514bcef48269a0eaddae493b1040ef3) '@rspack/core': 1.6.8(@swc/helpers@0.5.18) express: 4.22.2 - http-proxy-middleware: 3.0.7 + http-proxy-middleware: 3.0.5 picocolors: 1.1.1 tslib: 2.8.1 webpack: 5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15) @@ -12585,11 +13372,11 @@ snapshots: '@nx/nx-win32-x64-msvc@22.7.3': optional: true - '@nx/playwright@22.7.3(7fac41d12d50220d9e07e10b5d144c50)': + '@nx/playwright@22.7.3(5bbbe0927bab20b4820e03db46deb542)': dependencies: '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/eslint': 22.7.3(009a8c00054d1b9afc3e70df1013dd04) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/eslint': 22.7.3(2d77eedacad4a73d9b45ca88b5c668cd) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) minimatch: 10.2.5 tslib: 2.8.1 optionalDependencies: @@ -12606,14 +13393,14 @@ snapshots: - supports-color - verdaccio - '@nx/rspack@22.7.3(1d6a7f03de0f755cc4754f6896e4f79b)': + '@nx/rspack@22.7.3(571d341635a0c022b733deef2e6e4fdd)': dependencies: '@module-federation/enhanced': 2.5.0(@rspack/core@1.7.11(@swc/helpers@0.5.18))(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) '@module-federation/node': 2.7.43(@rspack/core@1.7.11(@swc/helpers@0.5.18))(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/module-federation': 22.7.3(1e7568c88119a8f46b3f44f17e8832c5) - '@nx/web': 22.7.3(ec92657a68652fe73393dccf800c48eb) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/module-federation': 22.7.3(a144bf2648da73d5ce3e21944d7ee54c) + '@nx/web': 22.7.3(7514bcef48269a0eaddae493b1040ef3) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) '@rspack/core': 1.6.8(@swc/helpers@0.5.18) '@rspack/dev-server': 1.2.1(@rspack/core@1.6.8(@swc/helpers@0.5.18))(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) @@ -12623,7 +13410,7 @@ snapshots: css-loader: 6.11.0(@rspack/core@1.6.8(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) enquirer: 2.3.6 express: 4.22.2 - http-proxy-middleware: 3.0.7 + http-proxy-middleware: 3.0.5 less-loader: 12.3.0(@rspack/core@1.6.8(@swc/helpers@0.5.18))(less@4.6.4)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) license-webpack-plugin: 4.0.2(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) loader-utils: 2.0.4 @@ -12677,68 +13464,20 @@ snapshots: - webpack-cli - webpack-hot-middleware - '@nx/vite@22.7.3(@babel/traverse@7.29.7)(@nx/eslint@22.7.3(009a8c00054d1b9afc3e70df1013dd04))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)))': - dependencies: - '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/vitest': 22.7.3(@babel/traverse@7.29.7)(@nx/eslint@22.7.3(009a8c00054d1b9afc3e70df1013dd04))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))) - '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) - ajv: 8.20.0 - enquirer: 2.3.6 - picomatch: 4.0.4 - semver: 7.8.5 - tsconfig-paths: 4.2.0 - tslib: 2.8.1 - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) - vitest: 4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) - transitivePeerDependencies: - - '@babel/traverse' - - '@nx/eslint' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - typescript - - verdaccio - optional: true - - '@nx/vitest@22.7.3(@babel/traverse@7.29.7)(@nx/eslint@22.7.3(009a8c00054d1b9afc3e70df1013dd04))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)))': - dependencies: - '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) - semver: 7.8.5 - tslib: 2.8.1 - optionalDependencies: - '@nx/eslint': 22.7.3(009a8c00054d1b9afc3e70df1013dd04) - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) - vitest: 4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - typescript - - verdaccio - - '@nx/web@22.7.3(ec92657a68652fe73393dccf800c48eb)': + '@nx/web@22.7.3(7514bcef48269a0eaddae493b1040ef3)': dependencies: '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) detect-port: 2.1.0 http-server: 14.1.1 picocolors: 1.1.1 tslib: 2.8.1 optionalDependencies: - '@nx/cypress': 22.7.3(8ceb40523cd4cfb53719524a7951f5ef) - '@nx/eslint': 22.7.3(009a8c00054d1b9afc3e70df1013dd04) - '@nx/jest': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3))(typescript@5.9.3) - '@nx/playwright': 22.7.3(7fac41d12d50220d9e07e10b5d144c50) - '@nx/vite': 22.7.3(@babel/traverse@7.29.7)(@nx/eslint@22.7.3(009a8c00054d1b9afc3e70df1013dd04))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))) - '@nx/webpack': 22.7.3(@babel/traverse@7.29.7)(@rspack/core@1.7.11(@swc/helpers@0.5.18))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3) + '@nx/cypress': 22.7.3(37f54892ee2fd5a2a97b4a7a57c0a11e) + '@nx/eslint': 22.7.3(2d77eedacad4a73d9b45ca88b5c668cd) + '@nx/jest': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3))(typescript@5.9.3) + '@nx/playwright': 22.7.3(5bbbe0927bab20b4820e03db46deb542) + '@nx/webpack': 22.7.3(@babel/traverse@7.29.0)(@rspack/core@1.7.11(@swc/helpers@0.5.18))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -12748,15 +13487,15 @@ snapshots: - supports-color - verdaccio - '@nx/webpack@22.7.3(@babel/traverse@7.29.7)(@rspack/core@1.7.11(@swc/helpers@0.5.18))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)': + '@nx/webpack@22.7.3(@babel/traverse@7.29.0)(@rspack/core@1.7.11(@swc/helpers@0.5.18))(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)))(typescript@5.9.3)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@nx/devkit': 22.7.3(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) - '@nx/js': 22.7.3(@babel/traverse@7.29.7)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) + '@nx/js': 22.7.3(@babel/traverse@7.29.0)(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))(nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18))) '@phenomnomnominal/tsquery': 6.2.0(typescript@5.9.3) ajv: 8.20.0 autoprefixer: 10.5.0(postcss@8.5.15) - babel-loader: 9.2.1(@babel/core@7.29.7)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) + babel-loader: 9.2.1(@babel/core@7.29.0)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) browserslist: 4.28.2 copy-webpack-plugin: 14.0.0(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) css-loader: 6.11.0(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) @@ -12783,7 +13522,7 @@ snapshots: tsconfig-paths-webpack-plugin: 4.2.0 tslib: 2.8.1 webpack: 5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15) - webpack-dev-server: 5.2.6(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) + webpack-dev-server: 5.2.4(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) webpack-node-externals: 3.0.0 webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) transitivePeerDependencies: @@ -12889,75 +13628,8 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 - '@oxc-parser/binding-android-arm-eabi@0.121.0': - optional: true - - '@oxc-parser/binding-android-arm64@0.121.0': - optional: true - - '@oxc-parser/binding-darwin-arm64@0.121.0': - optional: true - - '@oxc-parser/binding-darwin-x64@0.121.0': - optional: true - - '@oxc-parser/binding-freebsd-x64@0.121.0': - optional: true - - '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': - optional: true - - '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': - optional: true - - '@oxc-parser/binding-linux-arm64-gnu@0.121.0': - optional: true - - '@oxc-parser/binding-linux-arm64-musl@0.121.0': - optional: true - - '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': - optional: true - - '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': - optional: true - - '@oxc-parser/binding-linux-riscv64-musl@0.121.0': - optional: true - - '@oxc-parser/binding-linux-s390x-gnu@0.121.0': - optional: true - - '@oxc-parser/binding-linux-x64-gnu@0.121.0': - optional: true - - '@oxc-parser/binding-linux-x64-musl@0.121.0': - optional: true - - '@oxc-parser/binding-openharmony-arm64@0.121.0': - optional: true - - '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - - '@oxc-parser/binding-win32-arm64-msvc@0.121.0': - optional: true - - '@oxc-parser/binding-win32-ia32-msvc@0.121.0': - optional: true - - '@oxc-parser/binding-win32-x64-msvc@0.121.0': - optional: true - '@oxc-project/types@0.113.0': {} - '@oxc-project/types@0.121.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.19.1': optional: true @@ -13187,8 +13859,7 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': - optional: true + '@pkgr/core@0.2.9': {} '@playwright/test@1.60.0': dependencies: @@ -13464,9 +14135,9 @@ snapshots: connect-history-api-fallback: 2.0.0 express: 4.22.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.10(@types/express@4.17.25) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.4.0 - launch-editor: 2.14.1 + launch-editor: 2.13.2 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 @@ -13539,17 +14210,25 @@ snapshots: '@sigstore/core': 3.2.1 '@sigstore/protobuf-specs': 0.5.1 + '@sinclair/typebox@0.27.10': {} + '@sinclair/typebox@0.34.49': {} '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - optional: true + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers@15.4.0': dependencies: '@sinonjs/commons': 3.0.1 - optional: true '@standard-schema/spec@1.1.0': {} @@ -13637,13 +14316,6 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@ts-morph/common@0.22.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 9.0.9 - mkdirp: 3.0.1 - path-browserify: 1.0.1 - '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -13670,28 +14342,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 - optional: true '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.7 - optional: true + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - optional: true + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.7 - optional: true + '@babel/types': 7.29.0 '@types/body-parser@1.19.6': dependencies: @@ -13702,11 +14370,6 @@ snapshots: dependencies: '@types/node': 22.19.19 - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.1 @@ -13720,8 +14383,6 @@ snapshots: dependencies: '@types/node': 22.19.19 - '@types/deep-eql@4.0.2': {} - '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -13769,7 +14430,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.19 '@types/istanbul-lib-coverage@2.0.6': {} @@ -13781,6 +14442,17 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 + '@types/jest@30.0.0': + dependencies: + expect: 30.4.1 + pretty-format: 30.4.1 + + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 22.19.19 + '@types/tough-cookie': 4.0.5 + parse5: 7.3.0 + '@types/json-schema@7.0.15': {} '@types/mime@1.3.5': {} @@ -13793,9 +14465,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@22.20.0': - dependencies: - undici-types: 6.21.0 + '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -13836,12 +14506,13 @@ snapshots: dependencies: '@types/node': 22.19.19 - '@types/stack-utils@2.0.3': - optional: true + '@types/stack-utils@2.0.3': {} '@types/tmp@0.2.6': optional: true + '@types/tough-cookie@4.0.5': {} + '@types/ws@8.18.1': dependencies: '@types/node': 22.19.19 @@ -13854,18 +14525,35 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.19 optional: true - '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(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.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/type-utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.40.0 + eslint: 9.39.4(jiti@2.7.0) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@8.60.0(@typescript-eslint/parser@8.60.0(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.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/type-utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.61.0 - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/parser': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.60.0 + '@typescript-eslint/type-utils': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.60.0 + 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) @@ -13873,14 +14561,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/parser@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.40.0 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.60.0 + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.60.0 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.4(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.40.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.61.0 + '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@5.9.3) + '@typescript-eslint/types': 8.59.4 debug: 4.4.3(supports-color@8.1.1) - eslint: 10.4.1(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -13894,60 +14603,99 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.61.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.60.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@5.9.3) - '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/tsconfig-utils': 8.60.0(typescript@5.9.3) + '@typescript-eslint/types': 8.60.0 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@8.40.0': + dependencies: + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/scope-manager@8.59.4': dependencies: '@typescript-eslint/types': 8.59.4 '@typescript-eslint/visitor-keys': 8.59.4 - '@typescript-eslint/scope-manager@8.61.0': + '@typescript-eslint/scope-manager@8.60.0': + dependencies: + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/visitor-keys': 8.60.0 + + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 + typescript: 5.9.3 '@typescript-eslint/tsconfig-utils@8.59.4(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.61.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.60.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.59.4': {} - - '@typescript-eslint/types@8.61.0': {} + '@typescript-eslint/type-utils@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.0(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(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.40.0': {} + + '@typescript-eslint/types@8.59.4': {} + + '@typescript-eslint/types@8.60.0': {} + + '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.40.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.3) + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/visitor-keys': 8.40.0 + debug: 4.4.3(supports-color@8.1.1) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.9 + semver: 7.8.1 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/typescript-estree@8.59.4(typescript@5.9.3)': dependencies: @@ -13964,12 +14712,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.61.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.60.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.61.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@5.9.3) - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 + '@typescript-eslint/project-service': 8.60.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.60.0(typescript@5.9.3) + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/visitor-keys': 8.60.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.8.1 @@ -13979,36 +14727,52 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.59.4 '@typescript-eslint/types': 8.59.4 '@typescript-eslint/typescript-estree': 8.59.4(typescript@5.9.3) - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - eslint: 10.4.1(jiti@2.7.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.60.0 + '@typescript-eslint/types': 8.60.0 + '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/visitor-keys@8.40.0': + dependencies: + '@typescript-eslint/types': 8.40.0 + eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.59.4': dependencies: '@typescript-eslint/types': 8.59.4 eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.61.0': + '@typescript-eslint/visitor-keys@8.60.0': dependencies: - '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/types': 8.60.0 eslint-visitor-keys: 5.0.1 '@ungap/structured-clone@1.3.1': {} @@ -14083,50 +14847,9 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.12.2': optional: true - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.2(@types/node@22.19.19)(jiti@2.7.0)(less@4.4.2)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))': dependencies: - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) - - '@vitest/expect@4.1.9': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - chai: 6.2.2 - tinyrainbow: 3.1.0 - - '@vitest/mocker@4.1.9(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0))': - dependencies: - '@vitest/spy': 4.1.9 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) - - '@vitest/pretty-format@4.1.9': - dependencies: - tinyrainbow: 3.1.0 - - '@vitest/runner@4.1.9': - dependencies: - '@vitest/utils': 4.1.9 - pathe: 2.0.3 - - '@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/spy@4.1.9': {} - - '@vitest/utils@4.1.9': - dependencies: - '@vitest/pretty-format': 4.1.9 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 + vite: 7.3.2(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) '@webassemblyjs/ast@1.14.1': dependencies: @@ -14245,6 +14968,8 @@ snapshots: acorn@8.16.0: {} + add-stream@1.0.0: {} + address@2.0.3: {} adjust-sourcemap-loader@4.0.0: @@ -14256,10 +14981,10 @@ snapshots: ag-charts-types@10.3.9: {} - ag-grid-angular@32.3.9(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(ag-grid-community@32.3.9): + ag-grid-angular@32.3.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(ag-grid-community@32.3.9): dependencies: - '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/common': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) ag-grid-community: 32.3.9 tslib: 2.8.1 @@ -14334,21 +15059,21 @@ snapshots: '@algolia/requester-fetch': 5.48.1 '@algolia/requester-node-http': 5.48.1 - angular-eslint@21.4.0(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.4.1(jiti@2.7.0))(typescript-eslint@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(typescript@5.9.3): + angular-eslint@21.4.0(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.4(jiti@2.7.0))(typescript-eslint@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(typescript@5.9.3): dependencies: '@angular-devkit/core': 21.2.9(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.9(chokidar@5.0.0) - '@angular-eslint/builder': 21.4.0(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@angular-eslint/eslint-plugin': 21.4.0(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@angular-eslint/schematics': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(chokidar@5.0.0)(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@angular-eslint/template-parser': 21.4.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/builder': 21.4.0(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(chokidar@5.0.0)(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/eslint-plugin': 21.4.0(@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/eslint-plugin-template': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/schematics': 21.4.0(@angular-eslint/template-parser@21.4.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(@angular/cli@21.2.12(@types/node@22.19.19)(chokidar@5.0.0))(@typescript-eslint/types@8.59.4)(@typescript-eslint/utils@8.40.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@angular-eslint/template-parser': 21.4.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@angular/cli': 21.2.12(@types/node@22.19.19)(chokidar@5.0.0) '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/utils': 8.40.0(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: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) + typescript-eslint: 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) transitivePeerDependencies: - chokidar - supports-color @@ -14377,8 +15102,7 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: - optional: true + ansi-styles@5.2.0: {} ansi-styles@6.2.3: {} @@ -14395,7 +15119,6 @@ snapshots: argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - optional: true argparse@2.0.1: {} @@ -14419,8 +15142,6 @@ snapshots: assert-plus@1.0.0: optional: true - assertion-error@2.0.1: {} - astral-regex@2.0.0: optional: true @@ -14457,45 +15178,57 @@ snapshots: axios@1.16.0: dependencies: follow-redirects: 1.16.0(debug@4.4.3) - form-data: 4.0.6 + form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: - debug axobject-query@4.1.0: {} - babel-jest@30.4.1(@babel/core@7.29.7): + babel-jest@30.0.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@jest/transform': 30.0.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.0.0(@babel/core@7.29.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-jest@30.4.1(@babel/core@7.29.0): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@jest/transform': 30.4.1 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.4.0(@babel/core@7.29.7) + babel-preset-jest: 30.4.0(@babel/core@7.29.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - optional: true - babel-loader@10.0.0(@babel/core@7.29.7)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + babel-loader@10.0.0(@babel/core@7.29.0)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 find-up: 5.0.0 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) - babel-loader@9.2.1(@babel/core@7.29.7)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): + babel-loader@9.2.1(@babel/core@7.29.0)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 find-cache-dir: 4.0.0 schema-utils: 4.3.3 webpack: 5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15) - babel-plugin-const-enum@1.2.0(@babel/core@7.29.7): + babel-plugin-const-enum@1.2.0(@babel/core@7.29.0): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -14509,12 +15242,16 @@ snapshots: test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - optional: true + + babel-plugin-jest-hoist@30.0.0: + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@types/babel__core': 7.20.5 babel-plugin-jest-hoist@30.4.0: dependencies: '@types/babel__core': 7.20.5 - optional: true babel-plugin-macros@3.1.0: dependencies: @@ -14522,71 +15259,75 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.12 - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.3 - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.7): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): dependencies: - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.7): + babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): dependencies: - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): dependencies: - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.29.7)(@babel/traverse@7.29.7): + babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.29.0)(@babel/traverse@7.29.0): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 optionalDependencies: - '@babel/traverse': 7.29.7 - - babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) - optional: true - - babel-preset-jest@30.4.0(@babel/core@7.29.7): - dependencies: - '@babel/core': 7.29.7 + '@babel/traverse': 7.29.0 + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + + babel-preset-jest@30.0.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + babel-plugin-jest-hoist: 30.0.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + + babel-preset-jest@30.4.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 babel-plugin-jest-hoist: 30.4.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) - optional: true + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) balanced-match@1.0.2: {} @@ -14623,10 +15364,6 @@ snapshots: before-after-hook@2.2.3: {} - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - big.js@5.2.2: {} binary-extensions@2.3.0: {} @@ -14710,10 +15447,13 @@ snapshots: node-releases: 2.0.46 update-browserslist-db: 1.2.3(browserslist@4.28.2) + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + bser@2.1.1: dependencies: node-int64: 0.4.0 - optional: true buffer-crc32@0.2.13: optional: true @@ -14768,11 +15508,9 @@ snapshots: pascal-case: 3.1.2 tslib: 2.8.1 - camelcase@5.3.1: - optional: true + camelcase@5.3.1: {} - camelcase@6.3.0: - optional: true + camelcase@6.3.0: {} caniuse-api@3.0.0: dependencies: @@ -14786,8 +15524,6 @@ snapshots: caseless@0.12.0: optional: true - chai@6.2.2: {} - chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -14801,8 +15537,7 @@ snapshots: chalk@5.6.2: {} - char-regex@1.0.2: - optional: true + char-regex@1.0.2: {} chardet@0.7.0: {} @@ -14832,10 +15567,11 @@ snapshots: chrome-trace-event@1.0.4: {} + ci-info@3.9.0: {} + ci-info@4.4.0: {} - cjs-module-lexer@2.2.0: - optional: true + cjs-module-lexer@2.2.0: {} clean-css@5.3.3: dependencies: @@ -14900,13 +15636,9 @@ snapshots: clone@1.0.4: {} - co@4.6.0: - optional: true - - code-block-writer@12.0.0: {} + co@4.6.0: {} - collect-v8-coverage@1.0.3: - optional: true + collect-v8-coverage@1.0.3: {} color-convert@1.9.3: dependencies: @@ -14959,7 +15691,7 @@ snapshots: glob: 7.2.3 inquirer: 8.2.5 is-utf8: 0.2.1 - lodash: 4.18.1 + lodash: 4.17.21 minimist: 1.2.7 strip-bom: 4.0.0 strip-json-comments: 3.1.1 @@ -15013,12 +15745,68 @@ snapshots: dependencies: compare-func: 2.0.0 + conventional-changelog-atom@4.0.0: {} + + conventional-changelog-codemirror@4.0.0: {} + conventional-changelog-conventionalcommits@7.0.2: dependencies: compare-func: 2.0.0 + conventional-changelog-core@7.0.0: + dependencies: + '@hutson/parse-repository-url': 5.0.0 + add-stream: 1.0.0 + conventional-changelog-writer: 7.0.1 + conventional-commits-parser: 5.0.0 + git-raw-commits: 4.0.0 + git-semver-tags: 7.0.1 + hosted-git-info: 7.0.2 + normalize-package-data: 6.0.2 + read-pkg: 8.1.0 + read-pkg-up: 10.1.0 + + conventional-changelog-ember@4.0.0: {} + + conventional-changelog-eslint@5.0.0: {} + + conventional-changelog-express@4.0.0: {} + + conventional-changelog-jquery@5.0.0: {} + + conventional-changelog-jshint@4.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-preset-loader@4.1.0: {} + + conventional-changelog-writer@7.0.1: + dependencies: + conventional-commits-filter: 4.0.0 + handlebars: 4.7.9 + json-stringify-safe: 5.0.1 + meow: 12.1.1 + semver: 7.8.1 + split2: 4.2.0 + + conventional-changelog@5.1.0: + dependencies: + conventional-changelog-angular: 7.0.0 + conventional-changelog-atom: 4.0.0 + conventional-changelog-codemirror: 4.0.0 + conventional-changelog-conventionalcommits: 7.0.2 + conventional-changelog-core: 7.0.0 + conventional-changelog-ember: 4.0.0 + conventional-changelog-eslint: 5.0.0 + conventional-changelog-express: 4.0.0 + conventional-changelog-jquery: 5.0.0 + conventional-changelog-jshint: 4.0.0 + conventional-changelog-preset-loader: 4.1.0 + conventional-commit-types@3.0.0: {} + conventional-commits-filter@4.0.0: {} + conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 @@ -15026,6 +15814,15 @@ snapshots: meow: 12.1.1 split2: 4.2.0 + conventional-recommended-bump@9.0.0: + dependencies: + conventional-changelog-preset-loader: 4.1.0 + conventional-commits-filter: 4.0.0 + conventional-commits-parser: 5.0.0 + git-raw-commits: 4.0.0 + git-semver-tags: 7.0.1 + meow: 12.1.1 + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -15044,14 +15841,14 @@ snapshots: dependencies: is-what: 4.1.16 - copy-webpack-plugin@14.0.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + copy-webpack-plugin@14.0.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.0.5 tinyglobby: 0.2.16 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) copy-webpack-plugin@14.0.0(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: @@ -15098,7 +15895,7 @@ snapshots: cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 - js-yaml: 4.3.0 + js-yaml: 4.1.1 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: @@ -15108,7 +15905,7 @@ snapshots: dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.3.0 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: typescript: 5.9.3 @@ -15157,7 +15954,7 @@ snapshots: '@rspack/core': 1.7.11(@swc/helpers@0.5.18) webpack: 5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15) - css-loader@7.1.3(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + css-loader@7.1.3(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: icss-utils: 5.1.0(postcss@8.5.15) postcss: 8.5.15 @@ -15169,7 +15966,7 @@ snapshots: semver: 7.8.1 optionalDependencies: '@rspack/core': 1.7.11(@swc/helpers@0.5.18) - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) css-minimizer-webpack-plugin@8.0.0(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: @@ -15269,6 +16066,11 @@ snapshots: dependencies: css-tree: 2.2.1 + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + csv-parse@5.6.0: {} cuint@0.2.2: {} @@ -15291,7 +16093,7 @@ snapshots: cli-table3: 0.6.1 commander: 6.2.1 common-tags: 1.8.2 - dayjs: 1.11.21 + dayjs: 1.11.20 debug: 4.4.3(supports-color@8.1.1) enquirer: 2.4.1 eventemitter2: 6.4.7 @@ -15312,8 +16114,8 @@ snapshots: proxy-from-env: 1.0.0 request-progress: 3.0.0 supports-color: 8.1.1 - systeminformation: 5.31.12 - tmp: 0.2.7 + systeminformation: 5.27.7 + tmp: 0.2.5 tree-kill: 1.2.2 untildify: 4.0.0 yauzl: 2.10.0 @@ -15340,14 +16142,12 @@ snapshots: assert-plus: 1.0.0 optional: true - data-urls@7.0.0: + data-urls@5.0.0: dependencies: - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1 - transitivePeerDependencies: - - '@noble/hashes' + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 - dayjs@1.11.21: + dayjs@1.11.20: optional: true debug@2.6.9: @@ -15374,7 +16174,6 @@ snapshots: dedent@1.7.2(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 - optional: true deep-is@0.1.4: {} @@ -15414,8 +16213,7 @@ snapshots: detect-libc@2.1.2: optional: true - detect-newline@3.1.0: - optional: true + detect-newline@3.1.0: {} detect-node@2.1.0: {} @@ -15488,8 +16286,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: - optional: true + eastasianwidth@0.2.0: {} ecc-jsbn@0.1.2: dependencies: @@ -15503,15 +16300,13 @@ snapshots: electron-to-chromium@1.5.361: {} - emittery@0.13.1: - optional: true + emittery@0.13.1: {} emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: - optional: true + emoji-regex@9.2.2: {} emojis-list@3.0.0: {} @@ -15592,34 +16387,95 @@ snapshots: esbuild-wasm@0.27.3: {} - esbuild@0.28.1: + esbuild-wasm@0.28.0: {} + + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + esbuild@0.28.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.1 - '@esbuild/android-arm': 0.28.1 - '@esbuild/android-arm64': 0.28.1 - '@esbuild/android-x64': 0.28.1 - '@esbuild/darwin-arm64': 0.28.1 - '@esbuild/darwin-x64': 0.28.1 - '@esbuild/freebsd-arm64': 0.28.1 - '@esbuild/freebsd-x64': 0.28.1 - '@esbuild/linux-arm': 0.28.1 - '@esbuild/linux-arm64': 0.28.1 - '@esbuild/linux-ia32': 0.28.1 - '@esbuild/linux-loong64': 0.28.1 - '@esbuild/linux-mips64el': 0.28.1 - '@esbuild/linux-ppc64': 0.28.1 - '@esbuild/linux-riscv64': 0.28.1 - '@esbuild/linux-s390x': 0.28.1 - '@esbuild/linux-x64': 0.28.1 - '@esbuild/netbsd-arm64': 0.28.1 - '@esbuild/netbsd-x64': 0.28.1 - '@esbuild/openbsd-arm64': 0.28.1 - '@esbuild/openbsd-x64': 0.28.1 - '@esbuild/openharmony-arm64': 0.28.1 - '@esbuild/sunos-x64': 0.28.1 - '@esbuild/win32-arm64': 0.28.1 - '@esbuild/win32-ia32': 0.28.1 - '@esbuild/win32-x64': 0.28.1 + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + optional: true escalade@3.2.0: {} @@ -15627,20 +16483,24 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: - optional: true + escape-string-regexp@2.0.0: {} escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.4.1(jiti@2.7.0)): + eslint-config-prettier@10.0.0(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 10.4.1(jiti@2.7.0) + eslint: 9.39.4(jiti@2.7.0) eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 @@ -15650,27 +16510,32 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} - eslint@10.4.1(jiti@2.7.0): + eslint@9.39.4(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@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.23.5 - '@eslint/config-helpers': 0.6.0 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.9 ajv: 6.15.0 + chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -15681,7 +16546,8 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 + lodash.merge: 4.6.2 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -15689,11 +16555,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@11.2.0: + espree@10.4.0: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 5.0.1 + eslint-visitor-keys: 4.2.1 espree@9.6.1: dependencies: @@ -15701,8 +16567,7 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 3.4.3 - esprima@4.0.1: - optional: true + esprima@4.0.1: {} esquery@1.7.0: dependencies: @@ -15718,10 +16583,6 @@ snapshots: estree-walker@2.0.2: {} - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.9 - esutils@2.0.3: {} etag@1.8.1: {} @@ -15754,19 +16615,37 @@ snapshots: strip-final-newline: 2.0.0 optional: true + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + executable@4.1.1: dependencies: pify: 2.3.0 optional: true - exit-x@0.2.2: - optional: true + exit-x@0.2.2: {} expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - expect-type@1.4.0: {} + expect@30.0.0: + dependencies: + '@jest/expect-utils': 30.0.0 + '@jest/get-type': 30.0.0 + jest-matcher-utils: 30.0.0 + jest-message-util: 30.0.0 + jest-mock: 30.0.0 + jest-util: 30.0.0 expect@30.4.1: dependencies: @@ -15776,7 +16655,6 @@ snapshots: jest-message-util: 30.4.1 jest-mock: 30.4.1 jest-util: 30.4.1 - optional: true exponential-backoff@3.1.3: {} @@ -15861,7 +16739,7 @@ snapshots: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 - tmp: 0.2.7 + tmp: 0.0.33 extract-zip@2.0.1(supports-color@8.1.1): dependencies: @@ -15904,7 +16782,6 @@ snapshots: fb-watchman@2.0.2: dependencies: bser: 2.1.1 - optional: true fd-slicer@1.1.0: dependencies: @@ -15981,7 +16858,6 @@ snapshots: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - optional: true find-up@5.0.0: dependencies: @@ -16023,7 +16899,6 @@ snapshots: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - optional: true forever-agent@0.6.1: optional: true @@ -16047,12 +16922,12 @@ snapshots: transitivePeerDependencies: - tslib - form-data@4.0.6: + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.4 + hasown: 2.0.3 mime-types: 2.1.35 forwarded@0.2.0: {} @@ -16111,8 +16986,7 @@ snapshots: hasown: 2.0.3 math-intrinsics: 1.1.0 - get-package-type@0.1.0: - optional: true + get-package-type@0.1.0: {} get-proto@1.0.1: dependencies: @@ -16124,6 +16998,8 @@ snapshots: pump: 3.0.4 optional: true + get-stream@6.0.1: {} + getpass@0.1.7: dependencies: assert-plus: 1.0.0 @@ -16135,6 +17011,11 @@ snapshots: meow: 12.1.1 split2: 4.2.0 + git-semver-tags@7.0.1: + dependencies: + meow: 12.1.1 + semver: 7.8.1 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -16157,7 +17038,6 @@ snapshots: minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - optional: true glob@13.0.6: dependencies: @@ -16197,14 +17077,16 @@ snapshots: is-windows: 1.0.2 which: 1.3.1 - globals@17.6.0: {} + globals@14.0.0: {} - globrex@0.1.2: {} + globals@17.6.0: {} gopd@1.2.0: {} graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + handle-thing@2.0.1: {} handlebars@4.7.9: @@ -16216,8 +17098,7 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - harmony-reflect@1.6.2: - optional: true + harmony-reflect@1.6.2: {} has-flag@3.0.0: {} @@ -16243,17 +17124,17 @@ snapshots: dependencies: function-bind: 1.1.2 - hasown@2.0.4: - dependencies: - function-bind: 1.1.2 - he@1.2.0: {} homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - hono@4.12.27: {} + hono@4.12.22: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 hosted-git-info@9.0.3: dependencies: @@ -16270,14 +17151,11 @@ snapshots: dependencies: whatwg-encoding: 2.0.0 - html-encoding-sniffer@6.0.0: + html-encoding-sniffer@4.0.0: dependencies: - '@exodus/bytes': 1.15.1 - transitivePeerDependencies: - - '@noble/hashes' + whatwg-encoding: 3.1.1 - html-escaper@2.0.2: - optional: true + html-escaper@2.0.2: {} html-minifier-terser@6.1.0: dependencies: @@ -16343,7 +17221,7 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.10(@types/express@4.17.25): + http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.17 http-proxy: 1.18.1(debug@4.4.3) @@ -16355,7 +17233,7 @@ snapshots: transitivePeerDependencies: - debug - http-proxy-middleware@3.0.7: + http-proxy-middleware@3.0.5: dependencies: '@types/http-proxy': 1.17.17 debug: 4.4.3(supports-color@8.1.1) @@ -16410,6 +17288,8 @@ snapshots: human-signals@1.1.1: optional: true + human-signals@2.1.0: {} + husky@9.1.7: {} hyperdyperid@1.2.0: {} @@ -16433,7 +17313,6 @@ snapshots: identity-obj-proxy@3.0.0: dependencies: harmony-reflect: 1.6.2 - optional: true ieee754@1.2.1: {} @@ -16455,6 +17334,11 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + import-meta-resolve@4.2.0: {} imurmurhash@0.1.4: {} @@ -16500,6 +17384,26 @@ snapshots: through: 2.3.8 wrap-ansi: 7.0.0 + inquirer@8.2.7(@types/node@22.19.19): + dependencies: + '@inquirer/external-editor': 1.0.3(@types/node@22.19.19) + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + figures: 3.2.0 + lodash: 4.18.1 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + transitivePeerDependencies: + - '@types/node' + ip-address@10.2.0: {} ipaddr.js@1.9.1: {} @@ -16528,8 +17432,7 @@ snapshots: dependencies: get-east-asian-width: 1.6.0 - is-generator-fn@2.1.0: - optional: true + is-generator-fn@2.1.0: {} is-glob@4.0.3: dependencies: @@ -16572,8 +17475,7 @@ snapshots: is-promise@4.0.0: {} - is-stream@2.0.1: - optional: true + is-stream@2.0.1: {} is-text-path@2.0.0: dependencies: @@ -16621,7 +17523,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@babel/parser': 7.29.3 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 @@ -16634,7 +17536,6 @@ snapshots: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - optional: true istanbul-lib-source-maps@5.0.6: dependencies: @@ -16643,20 +17544,49 @@ snapshots: istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - optional: true istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - optional: true jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - optional: true + + jest-changed-files@30.0.0: + dependencies: + execa: 5.1.1 + jest-util: 30.0.0 + p-limit: 3.1.0 + + jest-circus@30.0.0(babel-plugin-macros@3.1.0): + dependencies: + '@jest/environment': 30.0.0 + '@jest/expect': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.2(babel-plugin-macros@3.1.0) + is-generator-fn: 2.1.0 + jest-each: 30.0.0 + jest-matcher-utils: 30.0.0 + jest-message-util: 30.0.0 + jest-runtime: 30.0.0 + jest-snapshot: 30.0.0 + jest-util: 30.0.0 + p-limit: 3.1.0 + pretty-format: 30.0.0 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color jest-circus@30.4.2(babel-plugin-macros@3.1.0): dependencies: @@ -16664,7 +17594,7 @@ snapshots: '@jest/expect': 30.4.1 '@jest/test-result': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2(babel-plugin-macros@3.1.0) @@ -16683,16 +17613,67 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - supports-color - optional: true + + jest-cli@30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)): + dependencies: + '@jest/core': 30.0.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + '@jest/test-result': 30.0.0 + '@jest/types': 30.0.0 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + jest-util: 30.0.0 + jest-validate: 30.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)): + dependencies: + '@babel/core': 7.29.0 + '@jest/get-type': 30.0.0 + '@jest/pattern': 30.0.0 + '@jest/test-sequencer': 30.0.0 + '@jest/types': 30.0.0 + babel-jest: 30.0.0(@babel/core@7.29.0) + chalk: 4.1.2 + ci-info: 4.4.0 + deepmerge: 4.3.1 + glob: 10.5.0 + graceful-fs: 4.2.11 + jest-circus: 30.0.0(babel-plugin-macros@3.1.0) + jest-docblock: 30.0.0 + jest-environment-node: 30.0.0 + jest-regex-util: 30.0.0 + jest-resolve: 30.0.0 + jest-runner: 30.0.0 + jest-util: 30.0.0 + jest-validate: 30.0.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.0.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.19.19 + ts-node: 10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color jest-config@30.4.2(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 '@jest/pattern': 30.4.0 '@jest/test-sequencer': 30.4.1 '@jest/types': 30.4.1 - babel-jest: 30.4.1(@babel/core@7.29.7) + babel-jest: 30.4.1(@babel/core@7.29.0) chalk: 4.1.2 ci-info: 4.4.0 deepmerge: 4.3.1 @@ -16716,7 +17697,13 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - supports-color - optional: true + + jest-diff@30.0.0: + dependencies: + '@jest/diff-sequences': 30.0.0 + '@jest/get-type': 30.0.0 + chalk: 4.1.2 + pretty-format: 30.0.0 jest-diff@30.4.1: dependencies: @@ -16724,12 +17711,22 @@ snapshots: '@jest/get-type': 30.1.0 chalk: 4.1.2 pretty-format: 30.4.1 - optional: true + + jest-docblock@30.0.0: + dependencies: + detect-newline: 3.1.0 jest-docblock@30.4.0: dependencies: detect-newline: 3.1.0 - optional: true + + jest-each@30.0.0: + dependencies: + '@jest/get-type': 30.0.0 + '@jest/types': 30.0.0 + chalk: 4.1.2 + jest-util: 30.0.0 + pretty-format: 30.0.0 jest-each@30.4.1: dependencies: @@ -16738,23 +17735,67 @@ snapshots: chalk: 4.1.2 jest-util: 30.4.1 pretty-format: 30.4.1 - optional: true + + jest-environment-jsdom@30.0.0: + dependencies: + '@jest/environment': 30.0.0 + '@jest/environment-jsdom-abstract': 30.0.0(jsdom@26.1.0) + '@types/jsdom': 21.1.7 + '@types/node': 22.19.19 + jsdom: 26.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.19.19 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-environment-node@30.0.0: + dependencies: + '@jest/environment': 30.0.0 + '@jest/fake-timers': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + jest-mock: 30.0.0 + jest-util: 30.0.0 + jest-validate: 30.0.0 jest-environment-node@30.4.1: dependencies: '@jest/environment': 30.4.1 '@jest/fake-timers': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 jest-mock: 30.4.1 jest-util: 30.4.1 jest-validate: 30.4.1 - optional: true + + jest-haste-map@30.0.0: + dependencies: + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.0 + jest-util: 30.0.0 + jest-worker: 30.0.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 jest-haste-map@30.4.1: dependencies: '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -16765,13 +17806,23 @@ snapshots: walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - optional: true + + jest-leak-detector@30.0.0: + dependencies: + '@jest/get-type': 30.0.0 + pretty-format: 30.0.0 jest-leak-detector@30.4.1: dependencies: '@jest/get-type': 30.1.0 pretty-format: 30.4.1 - optional: true + + jest-matcher-utils@30.0.0: + dependencies: + '@jest/get-type': 30.0.0 + chalk: 4.1.2 + jest-diff: 30.0.0 + pretty-format: 30.0.0 jest-matcher-utils@30.4.1: dependencies: @@ -16779,11 +17830,34 @@ snapshots: chalk: 4.1.2 jest-diff: 30.4.1 pretty-format: 30.4.1 - optional: true + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.29.0 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-message-util@30.0.0: + dependencies: + '@babel/code-frame': 7.29.0 + '@jest/types': 30.0.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.0.0 + slash: 3.0.0 + stack-utils: 2.0.6 jest-message-util@30.4.1: dependencies: - '@babel/code-frame': 7.29.7 + '@babel/code-frame': 7.29.0 '@jest/types': 30.4.1 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -16793,24 +17867,79 @@ snapshots: pretty-format: 30.4.1 slash: 3.0.0 stack-utils: 2.0.6 - optional: true + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.19.19 + jest-util: 29.7.0 + + jest-mock@30.0.0: + dependencies: + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + jest-util: 30.0.0 jest-mock@30.4.1: dependencies: '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 jest-util: 30.4.1 - optional: true + + jest-pnp-resolver@1.2.3(jest-resolve@30.0.0): + optionalDependencies: + jest-resolve: 30.0.0 jest-pnp-resolver@1.2.3(jest-resolve@30.4.1): optionalDependencies: jest-resolve: 30.4.1 - optional: true + + jest-preset-angular@16.0.0(858bae5f0c1a0b3d44321e7d1a8fdb12): + dependencies: + '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/platform-browser': 21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)) + '@angular/platform-browser-dynamic': 21.2.9(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/compiler@21.2.9)(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(@angular/platform-browser@21.2.9(@angular/animations@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)))(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))) + '@jest/environment-jsdom-abstract': 30.4.1(jsdom@26.1.0) + bs-logger: 0.2.6 + esbuild-wasm: 0.28.0 + jest: 30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + jest-util: 30.0.0 + jsdom: 26.1.0 + pretty-format: 30.4.1 + ts-jest: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.0))(esbuild@0.28.0)(jest-util@30.0.0)(jest@30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)))(typescript@5.9.3) + typescript: 5.9.3 + optionalDependencies: + esbuild: 0.28.0 + transitivePeerDependencies: + - '@babel/core' + - '@jest/transform' + - '@jest/types' + - babel-jest + - canvas jest-regex-util@30.0.0: {} jest-regex-util@30.4.0: {} + jest-resolve-dependencies@30.0.0: + dependencies: + jest-regex-util: 30.0.0 + jest-snapshot: 30.0.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@30.0.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.0) + jest-util: 30.0.0 + jest-validate: 30.0.0 + slash: 3.0.0 + unrs-resolver: 1.12.2 + jest-resolve@30.4.1: dependencies: chalk: 4.1.2 @@ -16821,7 +17950,33 @@ snapshots: jest-validate: 30.4.1 slash: 3.0.0 unrs-resolver: 1.12.2 - optional: true + + jest-runner@30.0.0: + dependencies: + '@jest/console': 30.0.0 + '@jest/environment': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.0.0 + jest-environment-node: 30.0.0 + jest-haste-map: 30.0.0 + jest-leak-detector: 30.0.0 + jest-message-util: 30.0.0 + jest-resolve: 30.0.0 + jest-runtime: 30.0.0 + jest-util: 30.0.0 + jest-watcher: 30.0.0 + jest-worker: 30.0.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color jest-runner@30.4.2: dependencies: @@ -16830,7 +17985,7 @@ snapshots: '@jest/test-result': 30.4.1 '@jest/transform': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -16849,7 +18004,33 @@ snapshots: source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - optional: true + + jest-runtime@30.0.0: + dependencies: + '@jest/environment': 30.0.0 + '@jest/fake-timers': 30.0.0 + '@jest/globals': 30.0.0 + '@jest/source-map': 30.0.0 + '@jest/test-result': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + chalk: 4.1.2 + cjs-module-lexer: 2.2.0 + collect-v8-coverage: 1.0.3 + glob: 10.5.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.0 + jest-message-util: 30.0.0 + jest-mock: 30.0.0 + jest-regex-util: 30.0.0 + jest-resolve: 30.0.0 + jest-snapshot: 30.0.0 + jest-util: 30.0.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color jest-runtime@30.4.2: dependencies: @@ -16860,7 +18041,7 @@ snapshots: '@jest/test-result': 30.4.1 '@jest/transform': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -16877,21 +18058,46 @@ snapshots: strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - optional: true + + jest-snapshot@30.0.0: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 + '@jest/expect-utils': 30.0.0 + '@jest/get-type': 30.0.0 + '@jest/snapshot-utils': 30.0.0 + '@jest/transform': 30.0.0 + '@jest/types': 30.0.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + chalk: 4.1.2 + expect: 30.0.0 + graceful-fs: 4.2.11 + jest-diff: 30.0.0 + jest-matcher-utils: 30.0.0 + jest-message-util: 30.0.0 + jest-util: 30.0.0 + pretty-format: 30.0.0 + semver: 7.8.1 + synckit: 0.11.12 + transitivePeerDependencies: + - supports-color jest-snapshot@30.4.1: dependencies: - '@babel/core': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.7) - '@babel/types': 7.29.7 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 '@jest/expect-utils': 30.4.1 '@jest/get-type': 30.1.0 '@jest/snapshot-utils': 30.4.1 '@jest/transform': 30.4.1 '@jest/types': 30.4.1 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) chalk: 4.1.2 expect: 30.4.1 graceful-fs: 4.2.11 @@ -16900,11 +18106,19 @@ snapshots: jest-message-util: 30.4.1 jest-util: 30.4.1 pretty-format: 30.4.1 - semver: 7.8.5 + semver: 7.8.1 synckit: 0.11.12 transitivePeerDependencies: - supports-color - optional: true + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.19.19 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.2 jest-util@30.0.0: dependencies: @@ -16924,31 +18138,57 @@ snapshots: graceful-fs: 4.2.11 picomatch: 4.0.4 + jest-validate@30.0.0: + dependencies: + '@jest/get-type': 30.0.0 + '@jest/types': 30.0.0 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.0.0 + jest-validate@30.4.1: dependencies: '@jest/get-type': 30.1.0 '@jest/types': 30.4.1 camelcase: 6.3.0 chalk: 4.1.2 - leven: 3.1.0 - pretty-format: 30.4.1 - optional: true + leven: 3.1.0 + pretty-format: 30.4.1 + + jest-watcher@30.0.0: + dependencies: + '@jest/test-result': 30.0.0 + '@jest/types': 30.0.0 + '@types/node': 22.19.19 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.0.0 + string-length: 4.0.2 jest-watcher@30.4.1: dependencies: '@jest/test-result': 30.4.1 '@jest/types': 30.4.1 - '@types/node': 22.20.0 + '@types/node': 22.19.19 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 jest-util: 30.4.1 string-length: 4.0.2 - optional: true jest-worker@27.5.1: dependencies: - '@types/node': 22.20.0 + '@types/node': 22.19.19 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@30.0.0: + dependencies: + '@types/node': 22.19.19 + '@ungap/structured-clone': 1.3.1 + jest-util: 30.0.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -16960,6 +18200,19 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jest@30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)): + dependencies: + '@jest/core': 30.0.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + '@jest/types': 30.0.0 + import-local: 3.2.0 + jest-cli: 30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + jiti@2.4.2: {} jiti@2.6.1: {} @@ -16970,44 +18223,44 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@3.15.0: + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - optional: true - js-yaml@4.3.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 jsbn@0.1.1: optional: true - jsdom@29.1.1: + jsdom@26.1.0: dependencies: - '@asamuzakjp/css-color': 5.1.11 - '@asamuzakjp/dom-selector': 7.1.1 - '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) - '@exodus/bytes': 1.15.1 - css-tree: 3.2.1 - data-urls: 7.0.0 + cssstyle: 4.6.0 + data-urls: 5.0.0 decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.5.0 - parse5: 8.0.1 + nwsapi: 2.2.23 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.1 - undici: 7.28.0 + tough-cookie: 5.1.2 w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.1 - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.21.0 xml-name-validator: 5.0.0 transitivePeerDependencies: - - '@noble/hashes' + - bufferutil + - supports-color + - utf-8-validate jsesc@3.1.0: {} @@ -17015,6 +18268,8 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-parse-even-better-errors@3.0.2: {} + json-parse-even-better-errors@5.0.0: {} json-schema-traverse@0.4.1: {} @@ -17028,8 +18283,7 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: - optional: true + json-stringify-safe@5.0.1: {} json5@2.2.3: {} @@ -17072,7 +18326,7 @@ snapshots: kind-of@6.0.3: {} - launch-editor@2.14.1: + launch-editor@2.13.2: dependencies: picocolors: 1.1.1 shell-quote: 1.8.4 @@ -17091,12 +18345,12 @@ snapshots: '@rspack/core': 1.7.11(@swc/helpers@0.5.18) webpack: 5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15) - less-loader@12.3.1(@rspack/core@1.7.11(@swc/helpers@0.5.18))(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + less-loader@12.3.1(@rspack/core@1.7.11(@swc/helpers@0.5.18))(less@4.4.2)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: less: 4.4.2 optionalDependencies: '@rspack/core': 1.7.11(@swc/helpers@0.5.18) - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) less@4.4.0: dependencies: @@ -17139,19 +18393,18 @@ snapshots: needle: 3.5.0 source-map: 0.6.1 - leven@3.1.0: - optional: true + leven@3.1.0: {} levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + license-webpack-plugin@4.0.2(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: webpack-sources: 3.5.0 optionalDependencies: - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) license-webpack-plugin@4.0.2(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: @@ -17165,6 +18418,8 @@ snapshots: lines-and-columns@2.0.3: {} + lines-and-columns@2.0.4: {} + lint-staged@17.0.5: dependencies: listr2: 10.2.1 @@ -17236,7 +18491,6 @@ snapshots: locate-path@5.0.0: dependencies: p-locate: 4.1.0 - optional: true locate-path@6.0.0: dependencies: @@ -17273,6 +18527,8 @@ snapshots: lodash.upperfirst@4.3.1: {} + lodash@4.17.21: {} + lodash@4.18.1: {} log-symbols@4.1.0: @@ -17309,8 +18565,7 @@ snapshots: dependencies: tslib: 2.8.1 - lru-cache@10.4.3: - optional: true + lru-cache@10.4.3: {} lru-cache@11.5.0: {} @@ -17336,8 +18591,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.8.5 - optional: true + semver: 7.8.1 make-error@1.3.6: {} @@ -17361,7 +18615,6 @@ snapshots: makeerror@1.0.12: dependencies: tmpl: 1.0.5 - optional: true math-intrinsics@1.1.0: {} @@ -17429,11 +18682,11 @@ snapshots: mimic-function@5.0.1: {} - mini-css-extract-plugin@2.10.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + mini-css-extract-plugin@2.10.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: schema-utils: 4.3.3 tapable: 2.3.3 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) mini-css-extract-plugin@2.4.7(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: @@ -17492,8 +18745,6 @@ snapshots: dependencies: minipass: 7.1.3 - mkdirp@3.0.1: {} - moment-timezone@0.5.48: dependencies: moment: 2.30.1 @@ -17534,8 +18785,7 @@ snapshots: nanoid@3.3.12: {} - napi-postinstall@0.3.4: - optional: true + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} @@ -17553,10 +18803,10 @@ snapshots: neo-async@2.6.2: {} - ng-packagr@21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): + ng-packagr@21.2.3(@angular/compiler-cli@21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3))(tslib@2.8.1)(typescript@5.9.3): dependencies: '@ampproject/remapping': 2.3.0 - '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.17)(typescript@5.9.3) + '@angular/compiler-cli': 21.2.9(@angular/compiler@21.2.9)(typescript@5.9.3) '@rollup/plugin-json': 6.1.0(rollup@4.60.4) '@rollup/wasm-node': 4.60.4 ajv: 8.20.0 @@ -17565,13 +18815,13 @@ snapshots: chokidar: 5.0.0 commander: 14.0.3 dependency-graph: 1.0.0 - esbuild: 0.28.1 + esbuild: 0.27.7 find-cache-directory: 6.0.0 injection-js: 2.6.1 jsonc-parser: 3.3.1 less: 4.6.4 ora: 9.4.0 - piscina: 5.2.0 + piscina: 5.1.4 postcss: 8.5.15 rollup-plugin-dts: 6.4.1(rollup@4.60.4)(typescript@5.9.3) rxjs: 7.8.2 @@ -17582,10 +18832,10 @@ snapshots: optionalDependencies: rollup: 4.60.4 - ngx-cookie-service@20.1.1(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2)): + ngx-cookie-service@20.1.1(@angular/common@21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2))(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2)): dependencies: - '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) - '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.16.2) + '@angular/common': 21.2.9(@angular/core@21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2))(rxjs@7.8.2) + '@angular/core': 21.2.9(@angular/compiler@21.2.9)(rxjs@7.8.2)(zone.js@0.16.2) tslib: 2.8.1 no-case@3.0.4: @@ -17621,14 +18871,13 @@ snapshots: graceful-fs: 4.2.11 nopt: 9.0.0 proc-log: 6.1.0 - semver: 7.8.5 - tar: 7.5.19 + semver: 7.8.1 + tar: 7.5.15 tinyglobby: 0.2.16 - undici: 6.27.0 + undici: 6.25.0 which: 6.0.1 - node-int64@0.4.0: - optional: true + node-int64@0.4.0: {} node-releases@2.0.46: {} @@ -17642,6 +18891,12 @@ snapshots: dependencies: abbrev: 4.0.0 + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.8.1 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} npm-bundled@5.0.0: @@ -17650,7 +18905,7 @@ snapshots: npm-install-checks@8.0.0: dependencies: - semver: 7.8.5 + semver: 7.8.1 npm-normalize-package-bin@5.0.0: {} @@ -17694,6 +18949,8 @@ snapshots: dependencies: boolbase: 1.0.0 + nwsapi@2.2.23: {} + nx@22.7.3(@swc-node/register@1.11.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@swc/core@1.15.8(@swc/helpers@0.5.18))(@swc/types@0.1.26)(typescript@5.9.3))(@swc/core@1.15.8(@swc/helpers@0.5.18)): dependencies: '@emnapi/core': 1.4.5 @@ -17743,7 +19000,7 @@ snapshots: figures: 3.2.0 flat: 5.0.2 follow-redirects: 1.16.0(debug@4.4.3) - form-data: 4.0.6 + form-data: 4.0.5 fs-constants: 1.0.0 function-bind: 1.1.2 get-caller-file: 2.0.5 @@ -17794,7 +19051,7 @@ snapshots: strip-bom: 3.0.0 supports-color: 7.2.0 tar-stream: 2.2.0 - tmp: 0.2.7 + tmp: 0.2.4 tree-kill: 1.2.2 tsconfig-paths: 4.2.0 tslib: 2.8.1 @@ -17828,8 +19085,6 @@ snapshots: obuf@1.1.2: {} - obug@2.1.3: {} - on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -17929,37 +19184,11 @@ snapshots: ordered-binary@1.6.1: optional: true + os-tmpdir@1.0.2: {} + ospath@1.2.2: optional: true - oxc-parser@0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): - dependencies: - '@oxc-project/types': 0.121.0 - optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.121.0 - '@oxc-parser/binding-android-arm64': 0.121.0 - '@oxc-parser/binding-darwin-arm64': 0.121.0 - '@oxc-parser/binding-darwin-x64': 0.121.0 - '@oxc-parser/binding-freebsd-x64': 0.121.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.121.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.121.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.121.0 - '@oxc-parser/binding-linux-arm64-musl': 0.121.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.121.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.121.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.121.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.121.0 - '@oxc-parser/binding-linux-x64-gnu': 0.121.0 - '@oxc-parser/binding-linux-x64-musl': 0.121.0 - '@oxc-parser/binding-openharmony-arm64': 0.121.0 - '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 - '@oxc-parser/binding-win32-x64-msvc': 0.121.0 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - oxc-resolver@11.19.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.19.1 @@ -17989,7 +19218,6 @@ snapshots: p-limit@2.3.0: dependencies: p-try: 2.2.0 - optional: true p-limit@3.1.0: dependencies: @@ -18002,7 +19230,6 @@ snapshots: p-locate@4.1.0: dependencies: p-limit: 2.3.0 - optional: true p-locate@5.0.0: dependencies: @@ -18025,11 +19252,9 @@ snapshots: is-network-error: 1.3.2 retry: 0.13.1 - p-try@2.2.0: - optional: true + p-try@2.2.0: {} - package-json-from-dist@1.0.1: - optional: true + package-json-from-dist@1.0.1: {} pacote@21.3.1: dependencies: @@ -18049,7 +19274,7 @@ snapshots: promise-retry: 2.0.1 sigstore: 4.1.1 ssri: 13.0.1 - tar: 7.5.19 + tar: 7.5.15 transitivePeerDependencies: - supports-color @@ -18069,6 +19294,14 @@ 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.0 + 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-node-version@1.0.1: {} parse-passwd@1.0.0: {} @@ -18085,6 +19318,10 @@ snapshots: parse5@4.0.0: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + parse5@8.0.1: dependencies: entities: 8.0.0 @@ -18096,8 +19333,6 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - path-browserify@1.0.1: {} - path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -18112,7 +19347,6 @@ snapshots: dependencies: lru-cache: 10.4.3 minipass: 7.1.3 - optional: true path-scurry@2.0.2: dependencies: @@ -18125,8 +19359,6 @@ snapshots: path-type@4.0.0: {} - pathe@2.0.3: {} - pend@1.2.0: optional: true @@ -18146,12 +19378,16 @@ snapshots: pirates@4.0.7: {} - piscina@5.2.0: + piscina@5.1.4: optionalDependencies: '@napi-rs/nice': 1.1.1 pkce-challenge@5.0.1: {} + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 @@ -18228,7 +19464,7 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.12 - postcss-loader@8.2.0(@rspack/core@1.7.11(@swc/helpers@0.5.18))(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + postcss-loader@8.2.0(@rspack/core@1.7.11(@swc/helpers@0.5.18))(postcss@8.5.12)(typescript@5.9.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: cosmiconfig: 9.0.1(typescript@5.9.3) jiti: 2.7.0 @@ -18236,7 +19472,7 @@ snapshots: semver: 7.8.1 optionalDependencies: '@rspack/core': 1.7.11(@swc/helpers@0.5.18) - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) transitivePeerDependencies: - typescript @@ -18446,13 +19682,24 @@ snapshots: lodash: 4.18.1 renderkid: 3.0.0 + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-format@30.0.0: + dependencies: + '@jest/schemas': 30.0.0 + ansi-styles: 5.2.0 + react-is: 18.3.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 - optional: true + react-is-19: react-is@19.2.6 proc-log@6.1.0: {} @@ -18489,8 +19736,7 @@ snapshots: punycode@2.3.1: {} - pure-rand@7.0.1: - optional: true + pure-rand@7.0.1: {} pvtsutils@1.3.6: dependencies: @@ -18498,6 +19744,11 @@ snapshots: pvutils@1.1.5: {} + qs@6.14.2: + dependencies: + side-channel: 1.1.0 + optional: true + qs@6.15.2: dependencies: side-channel: 1.1.0 @@ -18520,11 +19771,9 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - react-is@18.3.1: - optional: true + react-is@18.3.1: {} - react-is@19.2.7: - optional: true + react-is@19.2.6: {} react-refresh@0.18.0: {} @@ -18532,6 +19781,19 @@ snapshots: dependencies: pify: 2.3.0 + read-pkg-up@10.1.0: + dependencies: + find-up: 6.3.0 + read-pkg: 8.1.0 + type-fest: 4.41.0 + + read-pkg@8.1.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 7.1.1 + type-fest: 4.41.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -18602,6 +19864,10 @@ snapshots: requires-port@1.0.0: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 @@ -18726,6 +19992,8 @@ snapshots: transitivePeerDependencies: - supports-color + rrweb-cssom@0.8.0: {} + run-applescript@7.1.0: {} run-async@2.4.1: {} @@ -18831,14 +20099,14 @@ snapshots: sass-embedded-win32-arm64: 1.100.0 sass-embedded-win32-x64: 1.100.0 - sass-loader@16.0.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(sass-embedded@1.100.0)(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + sass-loader@16.0.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(sass-embedded@1.100.0)(sass@1.97.3)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: neo-async: 2.6.2 optionalDependencies: '@rspack/core': 1.7.11(@swc/helpers@0.5.18) sass: 1.97.3 sass-embedded: 1.100.0 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) sass-loader@16.0.8(@rspack/core@1.6.8(@swc/helpers@0.5.18))(sass-embedded@1.100.0)(sass@1.100.0)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: @@ -18928,8 +20196,6 @@ snapshots: semver@7.8.1: {} - semver@7.8.5: {} - send@0.19.2: dependencies: debug: 2.6.9 @@ -19038,8 +20304,6 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} - signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -19055,8 +20319,7 @@ snapshots: transitivePeerDependencies: - supports-color - slash@3.0.0: - optional: true + slash@3.0.0: {} slice-ansi@3.0.0: dependencies: @@ -19089,7 +20352,7 @@ snapshots: sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 - uuid: 11.1.1 + uuid: 8.3.2 websocket-driver: 0.7.4 socks-proxy-agent@8.0.5: @@ -19109,11 +20372,11 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + source-map-loader@5.0.0(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) source-map-loader@5.0.0(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: @@ -19125,7 +20388,6 @@ snapshots: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - optional: true source-map-support@0.5.19: dependencies: @@ -19141,8 +20403,18 @@ snapshots: source-map@0.7.6: {} + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + spdx-exceptions@2.5.0: {} + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 @@ -19173,8 +20445,7 @@ snapshots: split2@4.2.0: {} - sprintf-js@1.0.3: - optional: true + sprintf-js@1.0.3: {} sshpk@1.18.0: dependencies: @@ -19196,9 +20467,6 @@ snapshots: stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - optional: true - - stackback@0.0.2: {} stackframe@1.3.4: {} @@ -19206,8 +20474,6 @@ snapshots: statuses@2.0.2: {} - std-env@4.1.0: {} - stdin-discarder@0.3.2: {} string-argv@0.3.2: {} @@ -19216,7 +20482,6 @@ snapshots: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - optional: true string-width@4.2.3: dependencies: @@ -19229,7 +20494,6 @@ snapshots: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.2.0 - optional: true string-width@7.2.0: dependencies: @@ -19262,8 +20526,7 @@ snapshots: strip-bom@4.0.0: {} - strip-final-newline@2.0.0: - optional: true + strip-final-newline@2.0.0: {} strip-json-comments@3.1.1: {} @@ -19323,9 +20586,8 @@ snapshots: synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 - optional: true - systeminformation@5.31.12: + systeminformation@5.27.7: optional: true tapable@2.3.0: {} @@ -19340,7 +20602,7 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - tar@7.5.19: + tar@7.5.15: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -19348,16 +20610,16 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - terser-webpack-plugin@5.6.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + terser-webpack-plugin@5.6.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.48.0 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) optionalDependencies: '@swc/core': 1.15.8(@swc/helpers@0.5.18) - esbuild: 0.28.1 + esbuild: 0.27.3 postcss: 8.5.12 terser-webpack-plugin@5.6.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): @@ -19390,7 +20652,6 @@ snapshots: '@istanbuljs/schema': 0.1.6 glob: 7.2.3 minimatch: 3.1.5 - optional: true text-extensions@2.4.0: {} @@ -19405,8 +20666,6 @@ snapshots: thunky@1.1.0: {} - tinybench@2.9.0: {} - tinyexec@1.2.2: {} tinyglobby@0.2.15: @@ -19419,26 +20678,21 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinyrainbow@3.1.0: {} - - tldts-core@6.1.86: - optional: true - - tldts-core@7.4.6: {} + tldts-core@6.1.86: {} tldts@6.1.86: dependencies: tldts-core: 6.1.86 - optional: true - tldts@7.4.6: + tmp@0.0.33: dependencies: - tldts-core: 7.4.6 + os-tmpdir: 1.0.2 - tmp@0.2.7: {} + tmp@0.2.4: {} - tmpl@1.0.5: - optional: true + tmp@0.2.5: {} + + tmpl@1.0.5: {} to-regex-range@5.0.1: dependencies: @@ -19453,15 +20707,10 @@ snapshots: tough-cookie@5.1.2: dependencies: tldts: 6.1.86 - optional: true - - tough-cookie@6.0.1: - dependencies: - tldts: 7.4.6 tr46@0.0.3: {} - tr46@6.0.0: + tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -19487,6 +20736,27 @@ snapshots: transitivePeerDependencies: - tslib + ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@30.4.1)(@jest/types@30.4.1)(babel-jest@30.4.1(@babel/core@7.29.0))(esbuild@0.28.0)(jest-util@30.0.0)(jest@30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)))(typescript@5.9.3): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.9 + jest: 30.0.0(@types/node@22.19.19)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3)) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.8.1 + type-fest: 4.41.0 + typescript: 5.9.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.29.0 + '@jest/transform': 30.4.1 + '@jest/types': 30.4.1 + babel-jest: 30.4.1(@babel/core@7.29.0) + esbuild: 0.28.0 + jest-util: 30.0.0 + ts-loader@9.5.7(typescript@5.9.3)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: chalk: 4.1.2 @@ -19497,11 +20767,6 @@ snapshots: typescript: 5.9.3 webpack: 5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15) - ts-morph@21.0.1: - dependencies: - '@ts-morph/common': 0.22.0 - code-block-writer: 12.0.0 - ts-node@10.9.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(@types/node@22.19.19)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -19522,10 +20787,6 @@ snapshots: optionalDependencies: '@swc/core': 1.15.8(@swc/helpers@0.5.18) - tsconfck@3.1.6(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 @@ -19545,7 +20806,7 @@ snapshots: tsx@4.22.3: dependencies: - esbuild: 0.28.1 + esbuild: 0.28.0 optionalDependencies: fsevents: 2.3.3 optional: true @@ -19576,14 +20837,17 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: - optional: true + type-detect@4.0.8: {} type-fest@0.21.3: {} type-fest@0.8.1: optional: true + type-fest@3.13.1: {} + + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -19597,13 +20861,13 @@ snapshots: typed-assert@1.0.9: {} - typescript-eslint@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3): + typescript-eslint@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3))(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@5.9.3) - eslint: 10.4.1(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.60.0(@typescript-eslint/parser@8.60.0(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.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.0(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 @@ -19615,9 +20879,15 @@ snapshots: undici-types@6.21.0: {} - undici@6.27.0: {} + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@6.25.0: {} - undici@7.28.0: {} + undici@7.24.4: {} + + undici@7.24.7: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -19668,7 +20938,6 @@ snapshots: '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 - optional: true untildify@4.0.0: optional: true @@ -19693,7 +20962,7 @@ snapshots: utils-merge@1.0.1: {} - uuid@11.1.1: {} + uuid@8.3.2: {} v8-compile-cache-lib@3.0.1: {} @@ -19702,7 +20971,11 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - optional: true + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 validate-npm-package-name@7.0.2: {} @@ -19717,39 +20990,9 @@ snapshots: extsprintf: 1.3.0 optional: true - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)): - dependencies: - debug: 4.4.3(supports-color@8.1.1) - globrex: 0.1.2 - tsconfck: 3.1.6(typescript@5.9.3) - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) - transitivePeerDependencies: - - supports-color - - typescript - - vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.4.2)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0): - dependencies: - esbuild: 0.28.1 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.15 - rollup: 4.60.4 - tinyglobby: 0.2.16 - optionalDependencies: - '@types/node': 22.19.19 - fsevents: 2.3.3 - jiti: 2.7.0 - less: 4.4.2 - sass: 1.97.3 - sass-embedded: 1.100.0 - stylus: 0.64.0 - terser: 5.46.0 - tsx: 4.22.3 - yaml: 2.9.0 - - vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0): + vite@7.3.2(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0): dependencies: - esbuild: 0.28.1 + esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 postcss: 8.5.15 @@ -19767,9 +21010,9 @@ snapshots: tsx: 4.22.3 yaml: 2.9.0 - vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0): + vite@7.3.2(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.97.3)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0): dependencies: - esbuild: 0.28.1 + esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 postcss: 8.5.15 @@ -19788,34 +21031,6 @@ snapshots: yaml: 2.9.0 optional: true - vitest@4.1.9(@types/node@22.19.19)(jsdom@29.1.1)(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)): - dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - es-module-lexer: 2.1.0 - expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.2 - tinyglobby: 0.2.16 - tinyrainbow: 3.1.0 - vite: 7.3.6(@types/node@22.19.19)(jiti@2.7.0)(less@4.6.4)(sass-embedded@1.100.0)(sass@1.100.0)(stylus@0.64.0)(terser@5.46.0)(tsx@4.22.3)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.19.19 - jsdom: 29.1.1 - transitivePeerDependencies: - - msw - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -19823,7 +21038,6 @@ snapshots: walker@1.0.8: dependencies: makeerror: 1.0.12 - optional: true watchpack@2.5.1: dependencies: @@ -19843,9 +21057,9 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@8.0.1: {} + webidl-conversions@7.0.0: {} - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: colorette: 2.0.20 memfs: 4.56.11(tslib@2.8.1) @@ -19854,7 +21068,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) transitivePeerDependencies: - tslib @@ -19871,7 +21085,46 @@ snapshots: transitivePeerDependencies: - tslib - webpack-dev-server@5.2.6(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): + webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.8 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.10 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.4.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.1 + connect-history-api-fallback: 2.0.0 + express: 4.22.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.4.0 + launch-editor: 2.13.2 + open: 10.2.0 + p-retry: 6.2.1 + schema-utils: 4.3.3 + selfsigned: 5.5.0 + serve-index: 1.9.2 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) + ws: 8.21.0 + optionalDependencies: + webpack: 5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - tslib + - utf-8-validate + + webpack-dev-server@5.2.4(tslib@2.8.1)(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -19889,9 +21142,9 @@ snapshots: connect-history-api-fallback: 2.0.0 express: 4.22.2 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.10(@types/express@4.17.25) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.4.0 - launch-editor: 2.14.1 + launch-editor: 2.13.2 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 @@ -19926,10 +21179,10 @@ snapshots: webpack-sources@3.5.0: {} - webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)): + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)))(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)): dependencies: typed-assert: 1.0.9 - webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12) + webpack: 5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12) optionalDependencies: html-webpack-plugin: 5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) @@ -19940,7 +21193,7 @@ snapshots: optionalDependencies: html-webpack-plugin: 5.6.7(@rspack/core@1.7.11(@swc/helpers@0.5.18))(webpack@5.107.1(@swc/core@1.15.8(@swc/helpers@0.5.18))(postcss@8.5.15)) - webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12): + webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.9 @@ -19964,7 +21217,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.28.1)(postcss@8.5.12)) + terser-webpack-plugin: 5.6.0(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)(webpack@5.105.2(@swc/core@1.15.8(@swc/helpers@0.5.18))(esbuild@0.27.3)(postcss@8.5.12)) watchpack: 2.5.1 webpack-sources: 3.5.0 transitivePeerDependencies: @@ -20032,15 +21285,16 @@ snapshots: dependencies: iconv-lite: 0.6.3 - whatwg-mimetype@5.0.0: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 - whatwg-url@16.0.1: + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: dependencies: - '@exodus/bytes': 1.15.1 - tr46: 6.0.0 - webidl-conversions: 8.0.1 - transitivePeerDependencies: - - '@noble/hashes' + tr46: 5.1.1 + webidl-conversions: 7.0.0 whatwg-url@5.0.0: dependencies: @@ -20059,11 +21313,6 @@ snapshots: dependencies: isexe: 4.0.0 - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - wildcard@2.0.1: {} word-wrap@1.2.5: {} @@ -20093,7 +21342,6 @@ snapshots: ansi-styles: 6.2.3 string-width: 5.1.2 strip-ansi: 7.2.0 - optional: true wrap-ansi@9.0.2: dependencies: @@ -20107,7 +21355,6 @@ snapshots: dependencies: imurmurhash: 0.1.4 signal-exit: 4.1.0 - optional: true ws@8.18.0: {} diff --git a/renovate.json b/renovate.json deleted file mode 100644 index c0d00006f..000000000 --- a/renovate.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "description": [ - "Renovate is the single owner of dependency updates for this repo; keep repository-level (UI) Dependabot disabled.", - "Covers: pnpm dependencies (package.json + pnpm-lock.yaml — this repo uses pnpm, there is no package-lock.json), Go modules under apps/backend, Gradle dependencies, GitHub Actions pins, and Docker base images (nginx, postgres, distroless, golang, actions-runner).", - "The packageManager field (pnpm) is updated by the npm manager; Nx and Angular packages are grouped via the monorepo presets that config:recommended pulls in." - ], - "extends": ["github>jdwlabs/.github"], - "postUpdateOptions": ["gomodTidy", "pnpmDedupe"] -} diff --git a/scripts/README.md b/scripts/README.md index ce387dacf..126be0e18 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -7,16 +7,14 @@ These are **not Nx projects** and are excluded from Nx project detection via `.n All scripts are executable and accept arguments described in the usage comment at the top of each file. -| Script | Purpose | -| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| `build-image.sh` | Build a `jdwlabs/*` image with the full OCI label set and hand off to `docker buildx` (caller passes `--platform`, `--push`/`--load`) | -| `create-version.sh` | Write a `version.json` file into an app's `public/` dir after a semver release | -| `format.sh` | Run `nx format:write` across the workspace — called by the Nx `format` target in each app's `project.json` | -| `prepare-config.sh` | Swap `config.json` to its production values before a Docker image build | -| `restore-config.sh` | Restore `config.json` to its development defaults after a build | -| `update-app.sh` | Bump the `appVersion` in a Helm `Chart.yaml` to match the released semver tag | -| `update-description.sh` | Sync a DockerHub repo's Overview from that image's `README.docker.md` (needs `DOCKERHUB_USERNAME`/`DOCKERHUB_PASSWORD`) | -| `update-version.sh` | Update the version string in a `build.gradle.kts` (Spring Boot) to match the release tag | +| Script | Purpose | +| ------------------- | ---------------------------------------------------------------------------------------------------------- | +| `create-version.sh` | Write a `version.json` file into an app's `public/` dir after a semver release | +| `format.sh` | Run `nx format:write` across the workspace — called by the Nx `format` target in each app's `project.json` | +| `prepare-config.sh` | Swap `config.json` to its production values before a Docker image build | +| `restore-config.sh` | Restore `config.json` to its development defaults after a build | +| `update-app.sh` | Bump the `appVersion` in a Helm `Chart.yaml` to match the released semver tag | +| `update-version.sh` | Update the version string in a `build.gradle.kts` (Spring Boot) to match the release tag | ## Docker diff --git a/scripts/build-image.sh b/scripts/build-image.sh deleted file mode 100644 index 259bdc206..000000000 --- a/scripts/build-image.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env bash - -# Script: build-image.sh -# Description: Build a jdwlabs image with the full org.opencontainers.image.* label -# set and hand off to `docker buildx`. Centralising the ten OCI labels -# here means a label change is one edit instead of the same flags -# duplicated across every app's project.json (where they would drift). -# Usage: ./build-image.sh [buildx args...] -# image image name under jdwlabs/ (e.g. container) -# version semver tag; also the image.version label -# dockerfile path to the Dockerfile -# description one-line image.description label (quote if it has spaces) -# buildx args passed straight through to buildx — caller owns --platform and -# --push/--load (release pushes multi-arch; local uses --load) - -set -euo pipefail - -if [ "${#}" -lt 4 ]; then - echo "Usage: ${0} [buildx args...]" >&2 - exit 1 -fi - -image="${1}" -version="${2}" -dockerfile="${3}" -description="${4}" -shift 4 - -# revision/created are resolved here rather than passed in so every call site gets -# them for free. A missing git context is non-fatal: an image is still worth building -# without a traceable SHA, so fall back rather than abort. -revision="$(git rev-parse --short HEAD 2>/dev/null || echo unknown)" -created="$(date -u +%Y-%m-%dT%H:%M:%SZ)" - -# licenses is the SPDX id for PolyForm Noncommercial — the org's actual license. -docker buildx build \ - -f "${dockerfile}" \ - -t "jdwlabs/${image}:latest" \ - -t "jdwlabs/${image}:${version}" \ - --label "org.opencontainers.image.title=${image}" \ - --label "org.opencontainers.image.description=${description}" \ - --label "org.opencontainers.image.vendor=jdwlabs" \ - --label "org.opencontainers.image.licenses=PolyForm-Noncommercial-1.0.0" \ - --label "org.opencontainers.image.url=https://github.com/jdwlabs/apps" \ - --label "org.opencontainers.image.source=https://github.com/jdwlabs/apps" \ - --label "org.opencontainers.image.documentation=https://hub.docker.com/r/jdwlabs/${image}" \ - --label "org.opencontainers.image.version=${version}" \ - --label "org.opencontainers.image.revision=${revision}" \ - --label "org.opencontainers.image.created=${created}" \ - "${@}" \ - . - -echo "[${image}]: built ${image}:${version} (revision ${revision})" diff --git a/scripts/create-version.sh b/scripts/create-version.sh new file mode 100644 index 000000000..9b9a55024 --- /dev/null +++ b/scripts/create-version.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Script: create-version.sh +# Description: Creates a version file with the specified version number at the provided path. +# Usage: ./create-version.sh + +# Check if correct number of arguments are provided +if [ "${#}" -lt 3 ]; then + echo "Usage: ${0} " + exit 1 +fi + +# Assign arguments to variables +version=${1} +path=${2} +project_name=${3} + +# Create directory if it doesn't exist +mkdir -p "${path}" + +# Create version file +file_path="${path}/VERSION" +echo "${version}" > "${file_path}" + +git add "${file_path}" +git commit -m "chore(${project_name}): update project version file to version ${version}" +git push + +echo "[${project_name}]: Version file for version ${version} created at ${file_path}" \ No newline at end of file diff --git a/scripts/format.sh b/scripts/format.sh new file mode 100644 index 000000000..049e4eeb3 --- /dev/null +++ b/scripts/format.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# Script: format.sh +# Description: Apply nx formatting for repository. +# Usage: ./format.sh + +npx nx format:write + +git add . +git commit -m "style: apply nx formatting" +git push + +echo "NX formatting applied" \ No newline at end of file diff --git a/scripts/update-app.sh b/scripts/update-app.sh index c94272da5..d88ae45b6 100644 --- a/scripts/update-app.sh +++ b/scripts/update-app.sh @@ -1,70 +1,12 @@ #!/bin/bash # Script: update-app.sh -# Description: Bumps a Helm chart's appVersion in a deployment repo and pushes the change. -# Usage: update-app.sh -# -# Auth (one of): -# GH_APP_ID + GH_APP_PRIVATE_KEY GitHub App credentials. A fresh installation -# token scoped to the target repo (contents:write) is minted -# at push time — preferred in CI, never expires mid-run. -# DEPLOYMENTS_TOKEN A pre-minted token with write access (escape hatch for -# local/manual runs). Takes precedence if set. -# Optional env: -# DEPLOYMENTS_REPO Target repo slug. Default: jdwlabs/deployments -# DEPLOYMENTS_HOST Git host. Default: github.com +# Description: This script updates the version number of an application in a Git repository. +# Usage: update-app.sh set -euo pipefail -deployments_repo="${DEPLOYMENTS_REPO:-jdwlabs/deployments}" -deployments_host="${DEPLOYMENTS_HOST:-github.com}" -api_url="${GITHUB_API_URL:-https://api.${deployments_host}}" -git_repository="https://${deployments_host}/${deployments_repo}.git" - -base64url() { openssl base64 -A | tr '+/' '-_' | tr -d '='; } - -# Mint a short-lived installation token scoped to ${deployments_repo} from App -# credentials. Done at push time so a long build (e.g. multi-arch build-image -# running before this postTarget) can't expire a token minted at job start. -mint_installation_token() { - local app_id="${1}" private_key="${2}" repo="${3}" - local now iat exp header payload jwt inst_id repo_name token - - now=$(date +%s) - iat=$((now - 60)) # backdate to tolerate clock skew - exp=$((now + 540)) # 9 min; max allowed by GitHub is 10 - header='{"alg":"RS256","typ":"JWT"}' - payload="{\"iat\":${iat},\"exp\":${exp},\"iss\":\"${app_id}\"}" - jwt="$(printf '%s' "${header}" | base64url).$(printf '%s' "${payload}" | base64url)" - jwt="${jwt}.$(printf '%s' "${jwt}" | openssl dgst -sha256 -sign <(printf '%s' "${private_key}") -binary | base64url)" - - inst_id=$(curl -sf -H "Authorization: Bearer ${jwt}" -H "Accept: application/vnd.github+json" \ - "${api_url}/repos/${repo}/installation" | grep -o '"id"[[:space:]]*:[[:space:]]*[0-9]*' | head -1 | grep -o '[0-9]*$') - [ -n "${inst_id}" ] || { echo "Error: no App installation found for ${repo} (is the App installed?)." >&2; return 1; } - - repo_name="${repo#*/}" - token=$(curl -sf -X POST -H "Authorization: Bearer ${jwt}" -H "Accept: application/vnd.github+json" \ - "${api_url}/app/installations/${inst_id}/access_tokens" \ - -d "{\"repositories\":[\"${repo_name}\"],\"permissions\":{\"contents\":\"write\"}}" \ - | grep -o '"token"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/') - [ -n "${token}" ] || { echo "Error: failed to mint installation token for ${repo}." >&2; return 1; } - printf '%s' "${token}" -} - -if [ -n "${DEPLOYMENTS_TOKEN:-}" ]; then - deployments_token="${DEPLOYMENTS_TOKEN}" -elif [ -n "${GH_APP_ID:-}" ] && [ -n "${GH_APP_PRIVATE_KEY:-}" ]; then - deployments_token=$(mint_installation_token "${GH_APP_ID}" "${GH_APP_PRIVATE_KEY}" "${deployments_repo}") -else - echo "Error: set GH_APP_ID + GH_APP_PRIVATE_KEY (preferred) or DEPLOYMENTS_TOKEN." >&2 - exit 1 -fi - -# Authenticate via an http extraheader instead of embedding the token in the -# remote URL. This keeps the token out of .git/config and out of git's stderr -# (which echoes the remote URL on failure). Mirrors actions/checkout. -git_auth_header="AUTHORIZATION: basic $(printf '%s' "x-access-token:${deployments_token}" | base64 | tr -d '\n')" - +git_repository="git@github.com:jdwlabs/deployments.git" temp_dir=$(mktemp -d) # Always remove the clone, even on an unexpected exit, so failed runs leave no temp dirs behind. @@ -73,9 +15,9 @@ trap 'rm -rf "${temp_dir}"' EXIT clone_repository() { # A failed clone leaves temp_dir empty; without this guard the later git checks # run in a non-repo and report the misleading "Not inside a Git repository". - # Surface the real cause instead — usually DEPLOYMENTS_TOKEN lacking access. - if ! git -c http.extraheader="${git_auth_header}" clone "${git_repository}" "${temp_dir}"; then - echo "Error: Failed to clone ${deployments_repo}. Ensure DEPLOYMENTS_TOKEN has write access." >&2 + # Surface the real cause instead — usually the CI SSH key lacking access to deployments. + if ! git clone "${git_repository}" "${temp_dir}"; then + echo "Error: Failed to clone ${git_repository}. Ensure the CI SSH key has access to the deployments repository." >&2 exit 1 fi cd "${temp_dir}" || exit 1 @@ -121,7 +63,7 @@ check_uncommitted_changes() { # Function to push committed changes in the repository to remote push_changes() { - if ! git -c http.extraheader="${git_auth_header}" push; then + if ! git push; then echo "Error: Failed to push changes to remote repository." clean_repository exit 1 @@ -142,14 +84,6 @@ update_file() { git checkout HEAD "${file_path}" - # Fail loudly if the line is absent: otherwise sed is a no-op, nothing is - # staged, and the misleading failure surfaces later at the empty commit. - if ! grep -q '^appVersion:' "${file_path}"; then - echo "Error: no 'appVersion:' line found in ${file_path}." >&2 - clean_repository - exit 1 - fi - # Replace the app version line in the file sed -i "s/^appVersion: .*/appVersion: \"${new_version}\"/" "${file_path}" diff --git a/scripts/update-description.sh b/scripts/update-description.sh deleted file mode 100644 index fe1cac1b5..000000000 --- a/scripts/update-description.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash - -# Script: update-description.sh -# Description: Sync a DockerHub repo's Overview from a source-controlled README so the -# Hub page never drifts from the repo. Runs as an nx `version` postTarget, -# so it only fires for affected/released apps — matching the rest of the -# pipeline. Chosen over peter-evans/dockerhub-description because a script -# slots into the existing postTarget chain without a separate CI matrix. -# Usage: ./update-description.sh -# repo e.g. jdwlabs/container -# readmePath path to that image's README.docker.md -# Auth: DOCKERHUB_USERNAME / DOCKERHUB_PASSWORD (the creds CI already uses to push -# images). If org 2FA later blocks password login for the API, swap in a scoped -# PAT via the same env vars — no script change needed. - -set -euo pipefail - -if [ "${#}" -ne 2 ]; then - echo "Usage: ${0} " >&2 - exit 1 -fi - -repo="${1}" -readme="${2}" - -: "${DOCKERHUB_USERNAME:?DOCKERHUB_USERNAME must be set}" -: "${DOCKERHUB_PASSWORD:?DOCKERHUB_PASSWORD must be set}" - -# A missing README is a hard error: silently skipping would let the Hub page rot, -# which is the exact drift this script exists to prevent. -if [ ! -f "${readme}" ]; then - echo "README not found: ${readme}" >&2 - exit 1 -fi - -# Hub's short description caps at 100 chars. Derive it from the first line that is -# neither blank nor a heading — i.e. the tagline under the title, not the "# name" -# H1 — and strip markdown bold so it reads cleanly. Keeps it in sync with the README. -short="$(grep -m1 -vE '^[[:space:]]*(#|$)' "${readme}" | sed -E 's/\*\*//g; s/^#+ *//' | cut -c1-100)" - -token="$(curl -sf -H 'Content-Type: application/json' \ - -d "{\"username\": \"${DOCKERHUB_USERNAME}\", \"password\": \"${DOCKERHUB_PASSWORD}\"}" \ - https://hub.docker.com/v2/users/login/ | jq -r '.token')" - -if [ -z "${token}" ] || [ "${token}" = "null" ]; then - echo "DockerHub login failed for ${repo}" >&2 - exit 1 -fi - -# jq --rawfile slurps the README into a JSON string, handling quotes/newlines safely -# where naive interpolation would produce invalid JSON. -body="$(jq -n --rawfile full "${readme}" --arg short "${short}" \ - '{full_description: $full, description: $short}')" - -resp="$(mktemp)" -trap 'rm -f "${resp}"' EXIT - -# Fail loudly on any non-2xx so a broken sync surfaces in CI instead of passing silently. -http_code="$(curl -s -o "${resp}" -w '%{http_code}' -X PATCH \ - -H "Authorization: JWT ${token}" \ - -H 'Content-Type: application/json' \ - -d "${body}" \ - "https://hub.docker.com/v2/repositories/${repo}/")" - -if [ "${http_code}" -lt 200 ] || [ "${http_code}" -ge 300 ]; then - echo "DockerHub description update failed for ${repo} (HTTP ${http_code}):" >&2 - cat "${resp}" >&2 - exit 1 -fi - -echo "[${repo}]: Overview synced from ${readme}" diff --git a/scripts/update-version.sh b/scripts/update-version.sh new file mode 100644 index 000000000..e1d60571a --- /dev/null +++ b/scripts/update-version.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# Script: update-version.sh +# Description: A Bash script that updates a version property in a specified file to a new version number. +# Usage: ./update-version.sh + +# Function to update version property in a file +update_version() { + local file="${1}" + local new_version="${2}" + + if [ ! -f "${file}" ]; then + echo "Error: ${file} not found!" + exit 1 + fi + + # Update version property in the file + sed -i "s/version = \"\(.*\)\"/version = \"${new_version}\"/g" "${file}" +} + +# Check if correct number of arguments are provided +if [ "${#}" -lt 3 ]; then + echo "Usage: ${0} " + exit 1 +fi + +file_path="${1}" +new_version="${2}" +project_name="${3}" + +update_version "${file_path}" "${new_version}" + +git add "${file_path}" +git commit -m "chore(${project_name}): update project version file to version ${new_version}" +git push + +echo "[${project_name}]: Updated version to ${new_version} in ${file_path}" \ No newline at end of file diff --git a/tools/agents/README.md b/tools/agents/README.md index e80a7050a..81e0bbea3 100644 --- a/tools/agents/README.md +++ b/tools/agents/README.md @@ -72,14 +72,14 @@ Use `dev.sh` to build, run, or debug the image locally. ### 🔧 Commands -| Command | Description | -| ------- | ----------------------------------- | -| build | Build the image locally | -| run | Run the container interactively | -| rebuild | Build and run (clean start) | -| shell | Exec into a running container shell | -| clean | Remove container + image | -| help | Show available commands | +| Command | Description | +|-----------|--------------------------------------| +| build | Build the image locally | +| run | Run the container interactively | +| rebuild | Build and run (clean start) | +| shell | Exec into a running container shell | +| clean | Remove container + image | +| help | Show available commands | Example: diff --git a/tools/release/project.json b/tools/release/project.json deleted file mode 100644 index 43aeea7ac..000000000 --- a/tools/release/project.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "name": "release-tools", - "projectType": "library", - "sourceRoot": "tools/release", - "tags": ["type:util", "scope:shared", "framework:node"], - "targets": { - "test": { - "executor": "@nx/vitest:test", - "outputs": ["{workspaceRoot}/coverage/tools/release"], - "options": { "configFile": "tools/release/vite.config.ts" } - } - } -} diff --git a/tools/release/text-file-version-actions.spec.ts b/tools/release/text-file-version-actions.spec.ts deleted file mode 100644 index 5069dda5a..000000000 --- a/tools/release/text-file-version-actions.spec.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; -import TextFileVersionActions from './text-file-version-actions'; - -function makeActions( - root: string, - manifestPath: string, -): TextFileVersionActions { - const actions = new TextFileVersionActions( - { name: 'test-group' } as never, - { name: 'demo', type: 'app', data: { root } } as never, - {} as never, - ); - actions.manifestsToUpdate = [ - { manifestPath, preserveLocalDependencyProtocols: false }, - ]; - return actions; -} - -describe('TextFileVersionActions', () => { - it('reads the trimmed current version from the manifest', async () => { - const tree = createTreeWithEmptyWorkspace(); - tree.write('apps/demo/public/VERSION', '1.2.3\n'); - const actions = makeActions('apps/demo', 'apps/demo/public/VERSION'); - await expect( - actions.readCurrentVersionFromSourceManifest(tree), - ).resolves.toEqual({ - currentVersion: '1.2.3', - manifestPath: 'apps/demo/public/VERSION', - }); - }); - - it('throws when the manifest is missing', async () => { - const tree = createTreeWithEmptyWorkspace(); - const actions = makeActions('apps/demo', 'apps/demo/VERSION'); - await expect( - actions.readCurrentVersionFromSourceManifest(tree), - ).rejects.toThrow('apps/demo/VERSION'); - }); - - it('writes the new version with trailing newline to every configured manifest', async () => { - const tree = createTreeWithEmptyWorkspace(); - tree.write('apps/demo/VERSION', '1.2.3\n'); - const actions = makeActions('apps/demo', 'apps/demo/VERSION'); - const logs = await actions.updateProjectVersion(tree, '1.3.0'); - expect(tree.read('apps/demo/VERSION', 'utf-8')).toBe('1.3.0\n'); - expect(logs).toEqual(['Updated apps/demo/VERSION to 1.3.0']); - }); - - it('reports no registry and no dependency handling', async () => { - const tree = createTreeWithEmptyWorkspace(); - const actions = makeActions('apps/demo', 'apps/demo/VERSION'); - await expect( - actions.readCurrentVersionFromRegistry(tree, {}), - ).resolves.toBeNull(); - await expect( - actions.updateProjectDependencies(tree, {} as never, {}), - ).resolves.toEqual([]); - }); - - it('reports no dependency version, regardless of which dependency is asked about', async () => { - // VERSION-file projects carry no manifest-declared dependency specs, so - // there is nothing for @nx/release's dependent-bump resolution to read - // here — it must fall back to git-tag-based current-version resolution - // for any dependent project. This is the cascade behavior only verified - // via dry-run until now: a dependent project's version bump must not - // silently depend on this ever returning a real version. - const actions = makeActions('apps/demo', 'apps/demo/VERSION'); - await expect(actions.readCurrentVersionOfDependency()).resolves.toEqual({ - currentVersion: null, - dependencyCollection: null, - }); - }); -}); diff --git a/tools/release/text-file-version-actions.ts b/tools/release/text-file-version-actions.ts deleted file mode 100644 index 0c023d0aa..000000000 --- a/tools/release/text-file-version-actions.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { joinPathFragments, type ProjectGraph, type Tree } from '@nx/devkit'; -import { VersionActions } from 'nx/release'; - -/** - * Versions projects whose manifest is a plain-text VERSION file containing - * only the semver string. Used by every app in the release set; JS libs use - * Nx's built-in package.json actions instead. The manifest location comes - * from release.version.manifestRootsToUpdate (defaults to the project root). - */ -export default class TextFileVersionActions extends VersionActions { - validManifestFilenames = ['VERSION']; - - async readCurrentVersionFromSourceManifest( - tree: Tree, - ): Promise<{ currentVersion: string; manifestPath: string }> { - const manifestPath = - this.manifestsToUpdate[0]?.manifestPath ?? - joinPathFragments(this.projectGraphNode.data.root, 'VERSION'); - const contents = tree.read(manifestPath, 'utf-8'); - if (!contents || !contents.trim()) { - throw new Error(`Unable to read a version from "${manifestPath}"`); - } - return { currentVersion: contents.trim(), manifestPath }; - } - - async readCurrentVersionFromRegistry( - _tree: Tree, - _meta: object, - ): Promise { - // No registry exists for VERSION-file projects; current version comes - // from git tags (or the manifest via the disk resolver). - return null; - } - - async readCurrentVersionOfDependency(): Promise<{ - currentVersion: string | null; - dependencyCollection: string | null; - }> { - return { currentVersion: null, dependencyCollection: null }; - } - - async updateProjectVersion( - tree: Tree, - newVersion: string, - ): Promise { - const logs: string[] = []; - for (const { manifestPath } of this.manifestsToUpdate) { - tree.write(manifestPath, `${newVersion}\n`); - logs.push(`Updated ${manifestPath} to ${newVersion}`); - } - return logs; - } - - async updateProjectDependencies( - _tree: Tree, - _projectGraph: ProjectGraph, - _deps: object, - ): Promise { - // VERSION files carry no dependency specs. - return []; - } -} diff --git a/tools/release/tsconfig.json b/tools/release/tsconfig.json deleted file mode 100644 index a19d3b1be..000000000 --- a/tools/release/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { "module": "commonjs", "types": ["node"] }, - "include": ["**/*.ts"] -} diff --git a/tools/release/tsconfig.spec.json b/tools/release/tsconfig.spec.json deleted file mode 100644 index b1d7feba3..000000000 --- a/tools/release/tsconfig.spec.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "types": ["vitest/globals", "node"] - }, - "include": ["**/*.spec.ts", "**/*.ts"] -} diff --git a/tools/release/vite.config.ts b/tools/release/vite.config.ts deleted file mode 100644 index 2c51e5230..000000000 --- a/tools/release/vite.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -/// -import { defineConfig } from 'vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; - -export default defineConfig({ - plugins: [tsconfigPaths()], - test: { - globals: true, - environment: 'node', - include: ['**/*.spec.ts'], - reporters: ['default'], - passWithNoTests: true, - coverage: { - reportsDirectory: '../../coverage/tools/release', - }, - }, -}); diff --git a/tools/testing/angular-test-setup.ts b/tools/testing/angular-test-setup.ts deleted file mode 100644 index 95b73fab6..000000000 --- a/tools/testing/angular-test-setup.ts +++ /dev/null @@ -1,7 +0,0 @@ -import '@analogjs/vitest-angular/setup-zone'; -import { setupTestBed } from '@analogjs/vitest-angular/setup-testbed'; - -// Apps use provideZoneChangeDetection (not zoneless) in production, so tests -// must run zone-based too for behavioral parity with jest-preset-angular's -// setupZoneTestEnv. -setupTestBed({ zoneless: false }); diff --git a/tools/testing/angular-vite.config.ts b/tools/testing/angular-vite.config.ts deleted file mode 100644 index c8e048603..000000000 --- a/tools/testing/angular-vite.config.ts +++ /dev/null @@ -1,30 +0,0 @@ -/// -import angular from '@analogjs/vite-plugin-angular'; -import { defineConfig } from 'vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; - -/** - * Shared Vitest config for Angular projects. Each project's own - * `vite.config.ts` is a thin wrapper that supplies its coverage output dir -- - * kept per-project (not hoisted to workspace root) because the Nx executor - * (`@analogjs/vitest-angular:test`) resolves `configFile` relative to the - * project root, so every project needs its own config entry point. - */ -export function createAngularViteConfig(coverageDirectory: string) { - return defineConfig({ - plugins: [tsconfigPaths(), angular()], - test: { - globals: true, - environment: 'jsdom', - setupFiles: ['src/test-setup.ts'], - include: ['src/**/*.spec.ts'], - reporters: ['default'], - // Some util libs have no spec files yet (mirrors Jest's - // passWithNoTests, which the prior jest.config.ts relied on). - passWithNoTests: true, - coverage: { - reportsDirectory: coverageDirectory, - }, - }, - }); -} diff --git a/tools/testing/project.json b/tools/testing/project.json deleted file mode 100644 index cc685f465..000000000 --- a/tools/testing/project.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "name": "testing-shared", - "projectType": "library", - "sourceRoot": "tools/testing", - "tags": ["type:util", "scope:shared", "framework:angular"] -}